В настоящее время я изучаю С++ с книгой С++ Primer, и одно из упражнений в книге:
Объясните, что делает следующее выражение:
someValue ? ++x, ++y : --x, --y
Что мы знаем? Мы знаем, что тернарный оператор имеет более высокий приоритет, чем оператор запятой. С бинарными операторами это было довольно легко понять, но с тернарным оператором я немного борюсь. С бинарными операторами "с более высоким приоритетом" означает, что мы можем использовать круглые скобки вокруг выражения с более высоким приоритетом и не будем изменять выполнение.
Для тернарного оператора я бы сделал:
(someValue ? ++x, ++y : --x, --y)
в результате чего получается тот же код, который не помогает мне понять, как компилятор будет группировать код.
Однако из тестирования с помощью компилятора С++ я знаю, что выражение компилируется, и я не знаю, что оператор :
мог бы стоять сам по себе. Поэтому компилятор правильно интерпретирует тернарный оператор.
Затем я выполнил программу двумя способами:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Результаты в:
11 10
В то время как с someValue = false
он печатает:
9 9
Почему компилятор С++ генерирует код, который для истинной ветки тройного оператора только увеличивает x
, тогда как для ложной ветки тройки он уменьшает как x
, так и y
?
Я даже дошел до круглых скобок вокруг истинной ветки:
someValue ? (++x, ++y) : --x, --y;
но все равно результат 11 10
.