Ответ 1
Мы объясняем это ожиданием undefined поведения, а не какого-либо конкретного результата. Поскольку выражение пытается изменить x несколько раз без промежуточной точки последовательности, ее поведение undefined.
x = 1;
std::cout << ((++x)+(++x)+(++x));
Я ожидаю, что результат будет 11
, но на самом деле 12
. Почему?
Мы объясняем это ожиданием undefined поведения, а не какого-либо конкретного результата. Поскольку выражение пытается изменить x несколько раз без промежуточной точки последовательности, ее поведение undefined.
Как говорили другие, стандарты C и С++ не определяют поведение, которое это будет производить.
Но для тех людей, которые не понимают, почему стандарты будут делать такие вещи, пропустите пример "реального мира":
1 * 2 + 3 + 4 * 5
Нет ничего плохого в вычислении 1 * 2 + 3
, прежде чем вычислять 4*5
. Просто потому, что умножение имеет более высокий приоритет, чем добавление, не означает, что нам нужно выполнить все умножения в выражении, прежде чем делать какое-либо добавление. На самом деле существует множество разных заказов, которые вы действительно могли бы выполнять ваши расчеты.
Если оценки имеют побочные эффекты, разные оценки могут повлиять на результат. Если стандарт не определяет поведение, не полагайтесь на него.
Это фактически undefined. С++ не определяет явно порядок выполнения инструкции, поэтому он зависит от компилятора, и этот синтаксис не должен использоваться.
Фрагмент кода будет вызывать Undefined поведение на обоих языках C/С++. Читайте о точке последовательности из здесь.
По-моему
cout<<((++x)+(++x)+(++x));
компилятор сначала запускает префикc++ x, поэтому значение x становится
х = 2
теперь через ++ x, x станет
х = 3
после ++ x
х = 4
Теперь пришло время добавить значения x
х + х + х = 4 + 4 + 4
х + х + х = 12