В настоящее время я изучаю C ++ с помощью книги C ++ Primer, и одно из упражнений в книге:
Объясните, что делает следующее выражение:
someValue ? ++x, ++y : --x, --y
Что мы знаем? Мы знаем, что тернарный оператор имеет более высокий приоритет, чем оператор запятой. С бинарными операторами это было довольно легко понять, но с тернарным оператором я немного борюсь. С бинарными операторами «имеющий более высокий приоритет» означает, что мы можем использовать круглые скобки вокруг выражения с более высоким приоритетом, и это не изменит выполнение.
Для тернарного оператора я бы сделал:
(someValue ? ++x, ++y : --x, --y)
эффективно приводя к тому же коду, который не помогает мне понять, как компилятор сгруппирует код.
Однако из тестирования с компилятором C ++ я знаю, что выражение компилируется, и я не знаю, что :
оператор может обозначать сам по себе. Таким образом, компилятор, кажется, правильно интерпретирует тернарный оператор.
Затем я выполнил программу двумя способами:
#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
Почему компилятор C ++ генерирует код, который для истинной ветви тернарного оператора только увеличивает x
, а для ложной ветви тернарного оператора уменьшает и x
и y
?
Я даже зашел так далеко, что заключил настоящую ветку в круглые скобки:
someValue ? (++x, ++y) : --x, --y;
но это все равно приводит к 11 10
.
?
это условный оператор . Термин тернарный оператор просто означает оператор с тремя операндами. Условный оператор - один из примеров тернарного оператора, но язык может (теоретически) иметь несколько тернарных операторов.