2012-04-27 48 views

Trả lời

12

Không, không có điểm chuỗi với +. Thực sự có một câu trích dẫn trên trang Wikipedia về câu trả lời cho câu hỏi của bạn:

Hãy xem xét hai hàm f() và g(). Trong C và C++, toán tử + không được liên kết với một điểm chuỗi, và do đó trong biểu thức f() + g() có thể là f() hoặc g() sẽ được thực thi trước.

http://en.wikipedia.org/wiki/Sequence_points

2

Không, không phải. Thứ tự đánh giá của đối số hàm và toán tử là không xác định.

Tiêu chuẩn chỉ nói, các cuộc gọi đến foobar không thể xen kẽ, điều này có thể xảy ra khi đánh giá các biểu thức phụ không có cuộc gọi chức năng.

+2

Có đối số chức năng nào trong mã của anh ấy? – Pubby

+0

@Pubby thay thế chức năng với nhà điều hành ở đây. –

0

Không, đây không được định nghĩa. Từ K & R trang 200:

thứ tự đánh giá biểu thức, với một số trường hợp ngoại lệ nhất định, không xác định, ngay cả khi biểu hiện phụ liên quan đến tác dụng phụ. Tức là, trừ khi định nghĩa của toán tử đảm bảo rằng các toán hạng của nó được đánh giá theo một thứ tự cụ thể, việc thực thi là miễn phí để đánh giá toán hạng theo thứ tự bất kỳ, hoặc thậm chí để xen kẽ đánh giá của chúng.

R mô tả toán tử cộng và không xác định thứ tự của bộ đánh giá của hai toán hạng.

7

Đó là không xác định, và trong trường hợp của C99 báo giá phù hợp là 6,5/3:

Trừ khi Speci ed fi sau (đối với hàm gọi (), &&, ||, ?:, và khai thác dấu phẩy) , thứ tự đánh giá các biểu thức con và thứ tự trong đó các tác dụng phụ xảy ra đều không được xác định.

Trong ví dụ, foo()bar() là biểu thức con của biểu thức đầy đủ i = foo() + bar().

Các "sau" cho chức năng gọi là không trực tiếp liên quan ở đây, nhưng để tham khảo đó là 6.5.2.2/10:

Trình tự đánh giá của hàm vấn thiết kế, các đối số thực tế, và các biểu thức con trong các đối số thực tế là không xác định, nhưng có một điểm chuỗi trước cuộc gọi thực tế.

Đối với && là 6,5.13/4:

Khác với & điều hành nhị phân Bitwise, các & & đảm bảo điều hành trái sang phải đánh giá; có một điểm chuỗi sau khi đánh giá của toán hạng đầu tiên.

Kể từ + không có trong danh sách các nhà khai thác ở phía trên, &&+ là "không giống như" trong cùng một cách mà &&& là "không giống như", và điều này chính xác là điều bạn đang hỏi về . Không giống như &&, + không không đảm bảo đánh giá từ trái sang phải.

0

Câu trả lời đúng nơi tôi làm việc là "Nếu thứ tự quan trọng, mã không thể duy trì được bất kể tiêu chuẩn nói gì sẽ xảy ra". Nếu bạn phải có foo() được đánh giá trước thanh(), hãy đánh giá rõ ràng foo() trước thanh(). Cơ sở cho điều này không phải là mọi lập trình viên đều biết các tiêu chuẩn, và những người không biết liệu tác giả ban đầu có làm hay không.

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