Почему х = х ++; не работает, как я ожидал? [Дубликат]

0

Я всегда ожидал, что он работает так, как описано здесь: Что такое x после "x = x++"?

Но когда я попытался проверить это:

int x = 0;
x = x++;
printf("x = %d\n", x);

Результат не равен 0, как я ожидал, но 1. Мы протестировали его в VS2012 и g++ (версия 4.7).

Обратите внимание, что этот код печатает 0, как ожидалось:

int x = 0;
int y = x++;
printf("y = %d\n", y);
  • 4
    Потому что вы вызываете UB. Он может вернуть буквально все, что захочет, и при этом быть правильным.
  • 2
    или ничего не возвращать и вместо этого вызывать носовых демонов.
Показать ещё 6 комментариев
Теги:
operators
expression

1 ответ

11

Обратите внимание, что вы связываете вопрос Java, но вы пишете в C++.

В C (и унаследовано в C++), x = x++; не определено, поскольку вы изменяете x дважды между двумя точками последовательности. Это означает, что код может делать буквально все, включая кражу денег с вашего банковского счета и наем хитов, чтобы убить вас, а компилятор - в правильном направлении.

Радуйтесь, что он только устанавливает x в 1. :-)

  • 0
    Почему это отличается от int postinc(int& i) { int x = i; i = i + 1; return x; } i = postinc(i) ? Кстати: мой GCC возвращает 0 как для C, так и для C ++, и все, что я пробовал, -std= .
  • 0
    Итак, теперь я понимаю это, и это указано здесь, в точках последовательности в C и C ++: en.wikipedia.org/wiki/Sequence_point Перегруженный оператор действует как функция и создает точку последовательности, поэтому имеет значение, перегружен ли оператор или является нативным ,
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню