与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]
Posted
技术标签:
【中文标题】与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]【英文标题】:Comma operator precedence while used with ? : operator [duplicate] 【发布时间】:2013-05-27 01:57:24 【问题描述】:我不知道为什么下面两个子程序的结果不同:
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】:在这种情况下
(a > b)? a++,b-- : a--,b++;
相当于
((a > b)? a++,b-- : a--),b++;
【讨论】:
【参考方案3】:我猜这是因为x ? y
不能被认为是一个有效的表达式,因此逗号不能在那里分割运算符。 x ? y : z
是一个有效的表达式,冒号后面的逗号可以拆分成两个表达式。
【讨论】:
【参考方案4】: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
总而言之,虽然条件表达式的“中间”可以是一个完整的表达式,直到 :
,最后一个子表达式只能是一个排除表达式的 assignment-expression使用逗号运算符(除了逗号运算符作为 assignment-expression 的有效子表达式的一部分出现的情况,例如带括号的 primary-expression 或作为第二个操作数另一个条件表达式)。
在 C 中,最后一个子表达式受到更多限制,它甚至不能是赋值表达式,尽管在您的示例中这不是问题。
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
【讨论】:
这必须来自 C++ 标准,因为 'throw-expression' 不是 C 的一部分。但是,问题是双重标记的,所以它是有效的。 @JonathanLeffler:是的。 C 和 C++ 条件运算符语法之间存在重要差异;我正在浏览 C++ 问题,但没有注意到 C 标记。以上是关于与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 return 0 或 break 不能与逗号运算符一起使用?