Приоритет командного оператора во время использования?: оператор

Я не знаю, почему результат двух подпрограмм ниже:

    int a , b;

    a = 13, b=12;
    (a > b)? (a++,b--):(a--,b++); // Now a is 14 and b is 11

    a = 13, b=12;
    (a > b)? a++,b-- : a--,b++;   // Now a is 14 but b is 12

Однако для этих случаев результаты идентичны:

    a = 13, b=12;
    (a < b) ? a++,b-- : a--,b++; // Now a is 12 and b is 13

    a = 13, b=12;
    (a < b) ? (a++,b--) : (a--,b++); // Again a is 12 and b is 13

Почему скобки делают разницу для оператора после "?", но не имеют значения для оператора после ":"? У вас есть идеи?

Ответы

Ответ 1

Этот:

(a > b)? a++,b-- : a--,b++; 

эквивалентно:

((a > b) ? (a++, b--) : a--), b++;

поэтому b всегда увеличивается и только иногда уменьшается. Невозможно разобрать запятый оператор между ? и :, кроме как в скобках в выражении "эквивалент". Но после :, разуплотненная запятая завершает тернарный оператор ?: и оставляет приращение безусловным исполнением. Приоритет оператора запятой очень, очень низкий.

Ответ 2

Соответствующие части грамматики С++:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression
expression:
    assignment-expression
    expression, assignment-expression

В заключение, в то время как "средний" условного выражения может быть полным выражением, продолжающимся до :, последнее подвыражение может быть только выражением присваивания, которое исключает выражения, используя оператор запятой (кроме где оператор запятой появляется как часть действительного подвыражения выражения-назначения, такого как первичное выражение в скобках или как второй операнд другого условного выражения).

В C последнее подвыражение более ограничено, оно даже не может быть выражением присваивания, хотя это не вызывает беспокойства в вашем примере.

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

Ответ 3

В этом случае

(a > b)? a++,b-- : a--,b++; 

Это эквивалентно

((a > b)? a++,b-- : a--),b++; 

Ответ 4

Я предполагаю, потому что x ? y нельзя считать допустимым выражением, поэтому запятая не может разбить на нее оператор. x ? y : z является допустимым выражением, запятая после двоеточия может разбиваться на два выражения.