使用时逗号运算符优先级? :运算符

我不知道为什么下面两个子程序的结果不同:

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 

为什么括号在"?"之后对语句有所区别"?" ,但在":"之后的声明没有任何区别? 你有什么主意吗?

这个:

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

相当于:

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

所以b总是递增,有时只是递减。 有没有办法解析之间的逗号运算符?:除了在’等效’表达式中括号外。 但在: ,未加密码的逗号终止三元?:运算符并将增量保留为无条件执行。 逗号运算符的优先级非常非常低。

C ++语法的相关部分是:

 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 

总之,虽然条件表达式的“中间”可以是一个扩展到:的完整表达式,但最后一个子表达式只能是一个赋值表达式 ,它使用逗号运算符排除表达式(除了逗号运算符出现的位置)作为赋值表达式的有效子表达式的一部分,例如带括号的primary-expression或另一个条件表达式的第二个操作数)。

在C中,最后一个子表达式受到更多限制,它甚至不能是赋值表达式,尽管在您的示例中这不是一个问题。

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

在这种情况下

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

它相当于

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

我猜是因为x ? y x ? y不能被视为有效表达式,因此逗号不能在那里拆分运算符。 x ? y : z x ? y : z是一个有效的表达式,冒号后面的逗号可以分成两个表达式。