Вопрос

x = 1;
std::cout << ((++x)+(++x)+(++x));

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

Это было полезно?

Решение

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

Другие советы

Как говорили другие, стандарты 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top