【发布时间】:2013-06-28 16:39:33
【问题描述】:
在Does the C/C++ ternary operator actually have the same precedence as assignment operators?
Luchian Grigore 的回答说像
a ? b : c = d
总是会被推断为
a ? b : ( c = d )
因为 = 和 ?: 从右到左关联所以
在 C++ 中
k = 21 > 3 ? j = 12 : j = 10;
和
k = 1 > 3 ? j = 12 : j = 10;
两者都很好。
在 C 中
k = 21 > 3 ? 12 : j = 10
返回错误
invalid lvalue in assignment.
不应将以上推断为(并且不返回错误)
k= 21 > 3 ? 12 : ( j = 10 )
我假设现在它被分组为
k = ( 21 > 3 ? 12 : j ) = 10
给出错误,因为在 C(不是在 C++ 中)三元运算符不能返回左值。 谁能告诉我在这种情况下如何对运算符进行分组。
【问题讨论】:
-
我会尽量避免这种好奇心,只写 if (1 > 3) k = j = 12 else k = j = 10
-
a ? b : c = d在 C 和 C++ 中不同!一个是a ? b : (c = d),另一个是(a ? b : c) = d。 -
我认为它实际上被处理为
k=(21>3?12:j=10) -
这种情况的经验法则是“除非一目了然,毫无疑问,否则使用 () 或单独的子表达式”。由于 C 和 C++ 规则的不同,这在这里更适用。 ?: 中的原始作业不应该通过审核
-
我永远不会使用这样的代码,这只是为了了解事情是如何工作的。
标签: c++ c assignment-operator conditional-operator associativity