x = 1;
std::cout << ((++x)+(++x)+(++x));
Я ожидаю, что результат будет 11
, но на самом деле это 12
. Почему?
x = 1;
std::cout << ((++x)+(++x)+(++x));
Я ожидаю, что результат будет 11
, но на самом деле это 12
. Почему?
Мы объясняем это ожиданием неопределенного поведения, а не какого-либо конкретного результата. Поскольку выражение пытается изменить x несколько раз без вмешательства точки последовательности, его поведение не определено.
x
на самом деле не так уж сложно диагностировать, если бы в выражении могли быть псевдонимы, то это было бы так. Часто половина работы по выявлению ошибок хуже, чем ее отсутствие, поскольку это побуждает людей ошибочно думать, что им не нужно думать об этом классе ошибок, потому что компилятор сделает это за них.
- person Steve Jessop; 06.10.2009
Как уже говорили другие, стандарты C и C ++ не определяют поведение, которое это приведет.
Но для тех людей, которые не понимают, почему стандарты делают такое, давайте рассмотрим пример из «реального мира»:
1 * 2 + 3 + 4 * 5
Нет ничего плохого в вычислении 1 * 2 + 3
до вычисления 4*5
. Тот факт, что умножение имеет более высокий приоритет, чем сложение, не означает, что нам нужно выполнить все умножение в выражении перед выполнением любого сложения. На самом деле существует множество различных заказов, по которым вы действительно могли бы выполнять свои расчеты.
Если у оценок есть побочные эффекты, разные порядки оценки могут повлиять на результат. Если стандарт не определяет поведение, не полагайтесь на него.
На самом деле это не определено. C ++ явно не определяет порядок выполнения оператора, поэтому он зависит от компилятора, и этот синтаксис использовать не следует.
Фрагмент кода вызовет неопределенное поведение в обоих языках C / C ++. Подробнее о точке последовательности читайте в здесь.
На мой взгляд
cout<<((++x)+(++x)+(++x));
компилятор сначала запускает префикс ++ x, поэтому значение x становится
x=2
теперь к ++ x, x станет
x=3
после ++ x
x=4
Теперь пришло время добавить значения x
x+x+x=4+4+4
x+x+x=12
(++x)+(++x)+(++x)
заставляет компьютер выдвигать лоток для DVD. Но поскольку это не C ++, это не относится к этому вопросу. ;) - person jalf   schedule 22.11.2009