thể trùng lặp:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)Post-Tăng điều hành: Hành vi bất ngờ
Mã của tôi là như sau:
#include <stdio.h>
int main()
{
int x = 10, y = 0;
x = x++;
printf("x: %d\n", x);
y = x++;
printf("y: %d\n", y);
}
Do tính chất của bài thặng dư, tôi mong đợi kết quả sau:
x: 10
y: 10
Lý do của tôi là ở dòng 5, x
nên được gán cho giá trị ban đầu của nó sau khi gia tăng diễn ra.
Thay vào đó, tuy nhiên, tôi có được điều này:
x: 11
y: 11
Đào vào lắp ráp, điều này trông giống như một sự lựa chọn có chủ ý với tôi:
LCFI2:
movl $10, -4(%rbp) // this is x
movl $0, -8(%rbp) // this is y
incl -4(%rbp) // x is simply incremented
movl -4(%rbp), %esi
leaq LC0(%rip), %rdi
movl $0, %eax
call _printf
movl -4(%rbp), %eax // now x is saved in a register,
movl %eax, -8(%rbp) // copied to y,
incl -4(%rbp) // and finally incremented
movl -8(%rbp), %esi
leaq LC1(%rip), %rdi
movl $0, %eax
call _printf
gì đang xảy ra ở đây? Có phải GCC đang cố gắng cứu tôi khỏi chính tôi? Tôi không có một tài liệu tham khảo ngôn ngữ tiện dụng nhưng tôi đã có thể nghĩ rằng điều này phá vỡ các ngữ nghĩa dự định.
gớm ghiếc !!! –
http://en.wikipedia.org/wiki/Sequence_point – Ken
Trong những ngày cũ tồi tệ, 'a = 1 + a' trong một số ngôn ngữ nhất định là một mỏ mà tất cả các lỗi mới sẽ chạy trên đó. –