2010-10-07 38 views
5

thể trùng lặp:
How do we explain the result of the expression (++x)+(++x)+(++x)?++ i + ++ i + ++ i trong Java vs C

int i=2; 
i = ++i + ++i + ++i; 

Đó là chính xác hơn? Kết quả của Java là 12 hoặc C = 13. Hoặc nếu không phải là vấn đề chính xác, xin hãy giải thích. Cảm ơn bạn.

+13

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. –

+1

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

+3

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

Trả lời

16

Không có gì thích hợp hơn. Nó thực sự là không xác định và được gọi là Sequence Point Error. http://en.wikipedia.org/wiki/Sequence_point

+1

Cảm ơn bạn, tôi đã khai sáng bởi lỗi Sequence Point term. – Manny

+1

+1, rất đẹp. – JoshD

+15

Nó được xác định rõ trong Java. –

4

Trong C đây là hành vi không xác định. Không có chính xác.

5

Kết quả Java có ý nghĩa với tôi bởi vì các toán tử đưa ra kết quả bạn mong đợi, nhưng không có chương trình nghiêm túc nào chứa tuyên bố như thế này.

EDIT: Tôi thích thú khi câu trả lời một câu này là câu trả lời cao nhất của tôi về buổi tối (so với hàng tá câu trả lời khác tôi đăng, một số trang có mẫu mã). Cuộc sống là thế.

26

Đả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.

+0

Một câu hỏi nhỏ - là từ trái sang phải thực sự cần thiết ở đây? Trong ví dụ này, một đơn hàng khác có thể đưa ra kết quả khác không? Tôi cho rằng nó có liên quan hơn đến các câu lệnh như 'i = (i * = 2) + (i * = 3) + (i * = 4);', trong đó thứ tự quan trọng. – Kobi

+0

Xin cảm ơn, @Potatoswatter. –

+0

@Kobi, không thực sự, nhưng tôi hy vọng giải thích các trường hợp đơn giản sẽ giúp mọi người làm việc với những người phức tạp hơn. –

Các vấn đề liên quan