逗号操作符优先级,当使用?:运营商
Comma operator precedence while used with ? : operator
我不知道为什么下面两个子程序的结果不同:
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
总之,虽然一个条件表达式的"中产"可以是一个完整表达式扩展:
,最后子表达式只能一个赋值表达式不包括表达式使用逗号操作符(除了逗号操作符作为有效的子表达式的一部分出现的赋值表达式如括号主元表达式第二操作数或另一个条件表达式)。
在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 : z
为合法表达式,冒号后的逗号可以拆分为两个表达式
相关文章:
- 呼叫运营商<<临时
- 两个运营商的一些奇怪的冲突<<
- 如何在 CPP 中访问家长的运营商
- 如何明确调用好友流运营商
- 私有运营商删除会触发 GCC 和 Clang 的编译时错误,但不会在 MSVC 上触发编译时错误
- 使用运营商New分配的数据结构是否有任何副作用
- "Inheriting"移动运营商?
- 朋友ostream&运营商<<无法访问私人会员
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 范围的枚举(枚举类)关系运营商
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 对这两个分配运营商之间的不同感到困惑
- 我的班级意外加法运营商
- OpenACC - C++"新"运营商问题
- c 对运营商的一致性是新的,有多少重要
- 为什么我不能使私人运营商成为新的并使用默认实现?
- 全球取代所有新运营商
- 包装C 朋友在Cython中的非会员运营商
- 合法的交换运营商的模板实施
- 逗号操作符优先级,当使用?:运营商