Đảm bảo Java (§15.7.1) rằng nó sẽ được đánh giá từ trái sang phải, cho 12. Cụ thể, ++
có mức ưu tiên cao hơn là +
. Vì vậy, nó đầu tiên liên kết với những người, sau đó nó liên kết các hoạt động bổ sung trái sang phải
i = (((++i) + (++i)) + (++i));
§15.7.1 nói rằng toán hạng bên trái được đánh giá đầu tiên, và §15.7.2 nói cả hai toán hạng được đánh giá trước khi phẫu thuật. Vì vậy, nó đánh giá như:
i = (((++i) + (++i)) + (++i));
i = ((3 + (++i)) + (++i)); // i = 3;
i = ((3 + 4) + (++i)); // i = 4;
i = (7 + (++i)); // i = 4;
i = (7 + 5); // i = 5;
i = 12;
Trong C, hành vi chưa được xác định là sửa đổi hai lần không có điểm nối giữa.
Nguồn
2010-10-07 06:42:09
Thật kỳ quặc; khi tôi biên dịch nó trong C trình biên dịch của tôi nhảy múa như một con gà không xác định. –
tại sao -1? Đây có phải là câu hỏi không hợp lệ không? Anyhow @Strilanc, bạn đang sử dụng trình biên dịch nào? – Manny
Nếu bạn * thực sự * thấy điều đó trong mã của bạn, tôi nghĩ tốt hơn là nên refactor !! – romaintaz