2012-06-21 38 views
9

Tôi đã có bộ não của tôi nhăn từ cố gắng tìm hiểu các ví dụ trên trang này: http://answers.yahoo.com/question/index?qid=20091103170907AAxXYG9Thứ tự đánh giá biểu thức khác nhau giữa C++ và Java như thế nào?

Cụ thể hơn mã này:

int j = 4; 
cout << j++ << j << ++j << endl; 

đưa ra một sản lượng: 566

Bây giờ này có ý nghĩa với tôi nếu biểu thức được đánh giá từ phải sang trái, tuy nhiên trong Java một biểu thức tương tự:

int j = 4; 
System.out.print("" + (j++) + (j) + (++j)); 

cho kết quả là: 456

Điều này trực quan hơn vì điều này cho biết nó được đánh giá từ trái sang phải. Nghiên cứu này trên các trang web khác nhau, có vẻ như rằng với C + + hành vi khác nhau giữa các trình biên dịch, nhưng tôi vẫn không thuyết phục tôi hiểu. Giải thích cho sự khác biệt này trong đánh giá giữa Java và C++ là gì? Cảm ơn SO.

+2

Mọi thứ đều khác nhau. Nó không chỉ khác nhau giữa các trình biên dịch, nó là _against các rules_, và có thể thay đổi mỗi khi bạn biên dịch trên cùng một trình biên dịch, mỗi khi bạn chạy chương trình, hoặc thậm chí mỗi lần dòng được thực hiện. –

+0

có thể trùng lặp của [Cách xác định không xác định là hành vi không xác định?] (Http://stackoverflow.com/questions/7961067/how-undefined-is-undefined-behavior) –

+1

C++ được thiết kế để được tối ưu hóa, có nghĩa là tiêu chuẩn không đảm bảo kết quả nhất định để trình biên dịch được tự do tạo mã tối ưu. Trình tự bạn sử dụng trong ví dụ của mình là một chuỗi mà tôi tin là không được phép cụ thể. –

Trả lời

11

Khi hoạt động có tác dụng phụ, C++ dựa trên quy tắc sequence points để quyết định thời điểm tác dụng phụ (chẳng hạn như gia số, bài tập kết hợp, v.v.) phải có hiệu lực. Các toán tử logic and-then/or-else (&&||), số ba ? toán tử dấu hỏi và dấu phẩy tạo các điểm trình tự; +, -, << và những thứ khác thì không.

Ngược lại, Java hoàn thành các tác dụng phụ trước khi tiếp tục đánh giá thêm.

Khi bạn sử dụng biểu thức có tác dụng phụ nhiều lần khi không có các điểm chuỗi, hành vi kết quả sẽ không được xác định trong C++. Bất kỳ kết quả nào cũng có thể, bao gồm cả kết quả không hợp lý.

3

Trong C++ thứ tự đánh giá các biểu thức con không phải từ trái sang phải hay từ phải sang trái. Đó là không xác định.

5

Java đảm bảo rằng toán hạng của toán tử xuất hiện để được đánh giá theo thứ tự đánh giá cụ thể, cụ thể là từ trái sang phải. Toán hạng bên trái của toán tử nhị phân xuất hiện để được đánh giá đầy đủ trước khi bất kỳ phần nào của toán hạng bên phải được đánh giá. Java cũng đảm bảo rằng mọi toán hạng của toán tử (trừ các toán tử điều kiện &&, ||?:) dường như được đánh giá đầy đủ trước khi bất kỳ phần nào của hoạt động được thực hiện. Xem đặc tả ngôn ngữ Java §15.7 để biết thêm chi tiết.

C++, mặt khác, vui vẻ cho phép bạn thoát khỏi hành vi không xác định nếu biểu thức không rõ ràng vì bản thân ngôn ngữ không đảm bảo bất kỳ thứ tự đánh giá biểu thức con nào. Xem Sequence Point để biết thêm chi tiết.

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