Không xác định đối số nào cho +
được đánh giá trước - nhưng điều đó không quan trọng, vì trong C và C++, sửa đổi cùng một đối tượng hai lần mà không có điểm chuỗi can thiệp là hành vi hoàn toàn không xác định.
Ở đây bạn đang sửa đổi x
ba lần mà không có một điểm chuỗi can thiệp, vì vậy bạn cũng ra khỏi phòng;)
Phần liên quan của tiêu chuẩn C99 là "6,5 Expressions":
2 giữa điểm chuỗi trước và bên cạnh một đối tượng có trách nhiệm giá trị được lưu trữ của nó biến đổi tối đa một lần bởi việc đánh giá một n biểu thức. Ngoài ra, giá trị trước đó sẽ là chỉ đọc để xác định giá trị là được lưu trữ.
và
3 Các nhóm các nhà khai thác và toán hạng được chỉ định bởi cú pháp . Trừ khi có quy định sau (đối với chức năng gọi(), & &, ||,:, và dấu phẩy khai thác), thứ tự của đánh giá subexpressions và thứ tự mà tác dụng phụ xảy ra đều không xác định .
Có thể viết mã quy phạm pháp luật thể hiện thứ tự không xác định thẩm định - ví dụ:
#include <stdio.h>
int foo(void)
{
puts("foo");
return 1;
}
int bar(void)
{
puts("bar");
return 2;
}
int main()
{
int x;
x = foo() + bar();
putchar('\n');
return x;
}
(Đó là không xác định cho dù bạn nhận được kết quả của foobar
hoặc barfoo
).
Bản sao: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-iiiii-etc http://stackoverflow.com/questions/1826414/whats-the-value- của-ii-closed http://stackoverflow.com/questions/1788696/how-the-code-behaves-different-for-java-and-c-compiler – bk1e
lol. Mod mod-đóng câu hỏi riêng của mình: D – Earlz
@ bk1e: Cảm ơn các liên kết. Tôi đã có một cảm giác điều này sẽ được đề cập ở đây trước đây, nhưng nó đã không xuất hiện khi tôi hỏi câu hỏi. Tôi đã tìm ra cách nhanh nhất để tìm bản gốc sẽ là chỉ hỏi. :) –