Как мы можем объяснить результат выражения (++ x) + (++ x) + (++ x)? - PullRequest
13 голосов
/ 06 октября 2009
x = 1;
std::cout << ((++x)+(++x)+(++x));

Я ожидаю, что результат будет 11, но на самом деле 12. Почему?

Ответы [ 5 ]

65 голосов
/ 06 октября 2009

Мы объясняем это ожиданием неопределенного поведения , а не каким-либо конкретным результатом. Поскольку выражение пытается изменить x несколько раз без промежуточной точки последовательности , его поведение не определено .

12 голосов
/ 06 октября 2009

Как уже говорили другие, стандарты C и C ++ не определяют поведение, которое это будет производить.

Но для тех людей, которые не понимают, почему стандарты делают это, давайте рассмотрим пример из "реального мира":

1 * 2 + 3 + 4 * 5

Нет ничего плохого в вычислении 1 * 2 + 3 до того, как мы вычислим 4*5. Тот факт, что умножение имеет более высокий приоритет, чем сложение, не означает, что нам нужно выполнить all умножение в выражении перед выполнением любого сложения. На самом деле существует много разных заказов, которые вы действительно могли бы выполнять в своих расчетах.

Если оценки имеют побочные эффекты, на результат могут влиять различные порядки оценки. Если стандарт не определяет поведение, не полагайтесь на него .

4 голосов
/ 06 октября 2009

Это на самом деле не определено. C ++ не определяет явно порядок выполнения оператора, поэтому он зависит от компилятора, и этот синтаксис не должен использоваться.

3 голосов
/ 22 ноября 2009

Фрагмент кода вызовет Неопределенное поведение в обоих C / C ++. Прочитайте о Sequence Point от здесь .

0 голосов
/ 23 февраля 2015

На мой взгляд

cout<<((++x)+(++x)+(++x));

префикс первого запуска компилятора ++ x, поэтому значение x становится

х = 2


теперь ++ x, x станет

х = 3


после ++ x

х = 4


Теперь пришло время добавить значения x

х + х + х = 4 + 4 + 4

* * 1 022 х + х + х = 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...