可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)後遞增操作:意外的行爲
我的代碼如下:
#include <stdio.h>
int main()
{
int x = 10, y = 0;
x = x++;
printf("x: %d\n", x);
y = x++;
printf("y: %d\n", y);
}
考慮後遞增的性質,我會期望以下輸出:
x: 10
y: 10
我的推理是,在第5行中,x
應該在增量發生後分配給它的初始值。
相反,不過,我得到這個:
x: 11
y: 11
挖掘到組裝,這看起來像一個深思熟慮的選擇對我說:
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
這是怎麼回事? GCC是否試圖從我身上拯救我?我沒有一個方便的語言參考,但我會認爲這打破了預期的語義。
可憎的事! – 2010-07-19 02:32:59
http://en.wikipedia.org/wiki/Sequence_point – Ken 2010-07-19 02:59:32
在過去不好的日子裏,某些語言中的「a = 1 + a」是所有新bug都會遇到的問題。 – 2010-07-19 09:58:43