Подтвердить что ты не робот

Как выполняется это тернарное выражение?

int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;

Когда значение boolean равно 0, оно выводит 9, но когда оно 1, оно выводит 10. Я знаю, что это происходит из-за приоритета, но не может точно определить, как это происходит, пожалуйста, помогите мне понять это.

ПРИМЕЧАНИЕ. Я знаю, что могу получить ожидаемый результат, если я использую скобки или лучше писать чистый код, я просто использую это, чтобы понять, как компилятор будет оценивать выражения, подобные этим, в соответствии с приоритетом.

4b9b3361

Ответ 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 или беспокоиться о приоритете , или ?: или о том, что логистика назначения для такого комплекса выражение. Любой современный компилятор будет оптимизировать как это, так и выше, с тем же результатом кода