Как выполняется это тернарное выражение?
int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;
Когда значение boolean равно 0, оно выводит 9, но когда оно 1, оно выводит 10. Я знаю, что это происходит из-за приоритета, но не может точно определить, как это происходит, пожалуйста, помогите мне понять это.
ПРИМЕЧАНИЕ. Я знаю, что могу получить ожидаемый результат, если я использую скобки или лучше писать чистый код, я просто использую это, чтобы понять, как компилятор будет оценивать выражения, подобные этим, в соответствии с приоритетом.
Ответы
Ответ 1
,
имеет более низкий приоритет, чем ?:
. Это означает, что полные скобки заключаются в следующем:
int k = ((boolean ? (++x, ++y) : --x), --y);
Как вы можете видеть, k
всегда инициализируется значением --y
. Просто, если boolean
есть true
, ++y
происходит до этого.
При поиске полной формы скобки выражения, подумайте об этом как о создании дерева выражений (где оператор с наименьшим приоритетом находится в корне).
Найдите оператор наименьшего приоритета в выражении и в скобках вставьте его аргумент левой стороны и его аргумент правой стороны. Повторите рекурсивно в подвыражениях только в скобках.
Ответ 2
Благодаря оператору запятой, имеющему самый низкий приоритет оператора, ваше утверждение фактически равно
k = (boolean ? (++x, ++y) : --x), --y;
Это означает, что когда boolean
true
, вы увеличиваете и уменьшаете y
. Результат тройного выражения отбрасывается в обоих случаях, а k
присваивается результат --y
.
Следует отметить, что это не поведение undefined, так как оператор запятой вводит точку последовательности.
Чтобы получить ожидаемый результат, вам нужно выполнить
k = boolean ? (++x, ++y) : (--x, --y);
Обратите внимание, что круглые скобки вокруг ++x, ++y
строго не нужны, но это делает выражение более понятным.
Ответ 3
Учитывая вышеупомянутые превосходные ответы, следует написать вместо этого:
if (boolean) {
++x;
++y;
} else {
--x;
--y;
}
int k = y;
Потому что тогда код более доступен для чтения и clear в своем намерении. Это поможет любому, кто должен поддерживать код (включая автора оригинала!), Без необходимости тратить время, задавая вопросы SO или беспокоиться о приоритете ,
или ?:
или о том, что логистика назначения для такого комплекса выражение. Любой современный компилятор будет оптимизировать как это, так и выше, с тем же результатом кода