2012-08-23 33 views
7

thể trùng lặp:
cout << order of call to functions it prints?
Undefined Behavior and Sequence Pointsđiều hành ưu tiên

Tại sao đang in này 2 1 0?

#include <iostream> 
struct A{ 
    int p; 
    A():p(0){} 
    int get(){ 
    return p++; 
    } 
}; 


int main(){ 
A a; 
std::cout<<a.get()<<" "<<a.get()<<" "<<a.get()<<std::endl; 
} 
+2

Không có điểm thứ tự ... §6.2.2 __The thứ tự đánh giá các biểu thức con trong biểu thức không xác định .__ – oldrinb

+0

Cảm ơn bạn, đây có vẻ là lý do, được xác nhận trong http://stackoverflow.com/questions/ 3463261/operator-ưu tiên-cho-và-trong-vs2008-với-tối ưu hóa? Rq = 1 Hãy bình luận của bạn một câu trả lời, tôi sẽ đánh dấu nó là cuối cùng –

+0

Tôi đã đăng bình luận của tôi như là một câu trả lời :-) – oldrinb

Trả lời

4

Như tôi đã nói ở my comment, không có điểm chuỗi ...

Theo §6.2.2 của Stroustrup của C++ Programming Language, Third Edition ...

Thứ tự đánh giá biểu thức con trong biểu thức không xác định. Đặc biệt, bạn không thể giả định rằng biểu thức được đánh giá từ trái sang phải.

§ 5,4 của C++ 03 tiêu chuẩn xác:

Trừ khi có ghi chú, trình tự đánh giá của các toán hạng của các nhà khai thác cá nhân và subexpressions của biểu thức cá nhân, và thứ tự mà tác dụng phụ diễn ra, không xác định. Giữa điểm chuỗi trước đó và tiếp theo đối tượng vô hướng phải có giá trị được lưu trữ của nó được sửa đổi nhiều nhất một lần bằng cách đánh giá biểu thức.

Bạn có thể tìm hiểu thêm về các điểm chuỗi và hành vi không xác định here.

+2

Nơi nào trích dẫn của bạn đến từ đâu? Tôi đã xem trong C++ 03, C++ 11, C90, C99 và C11 và không có phiên bản 6.2.2 nào với nội dung đó. BTW, C++ 03 trong 5/4 nói "Trừ khi được ghi chú, thứ tự đánh giá toán hạng của các toán tử riêng lẻ và biểu thức con của các biểu thức riêng lẻ và thứ tự xảy ra các tác dụng phụ, ** không xác định **." (và phiên bản tôi đang sử dụng đã thay đổi đánh dấu từ C++ 98, do đó có thể không thay đổi). Sự khác biệt với ** undefined ** là mã phải cung cấp một trong nhiều kết quả và có thể không bắt đầu khởi chạy một nhóm daemon ra khỏi mũi của bạn. – AProgrammer

+0

Stroustrup * Ngôn ngữ lập trình C++ *, đặc biệt là ấn bản thứ 3. *** Thứ tự đánh giá các biểu thức con trong một biểu thức là không xác định. Cụ thể, bạn không thể giả định rằng biểu thức được đánh giá từ trái sang phải *** *** – oldrinb

+0

Nhân tiện, tôi không nghĩ điểm của bạn về sự khác biệt giữa * không xác định * và * không xác định * trong ngữ cảnh này giữ bất kỳ trọng số nào, thứ tự đánh giá * không xác định * giữa các điểm chuỗi chỉ có nghĩa là nó có thể được thực hiện tuy nhiên môi trường mong muốn nó được thực hiện - tức là giống như * không xác định *. Thứ tự là không xác định đưa đến hành vi không xác định :-) – oldrinb

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