使用时逗号运算符优先级? :运算符
我不知道为什么下面两个子程序的结果不同:
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
是一个有效的表达式,冒号后面的逗号可以分成两个表达式。