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