Можно создать дубликат:
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
Мое рассуждение состоит в том, что в строкедолжно быть назначено его начальному значению после того,
Вместо этого, однако, я получаю это:
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
В старые добрые времена 'a = 1 + a' на некоторых языках был мином, на который наступали все новые ошибки. –