以下代码编译良好 p>
int a=5,b=4,c;
a>b?30:40;
也是,
int a=5,b=4,c;
a>b?c=30:40;
但为什么这不起作用?
int a=5,b=4,c;
a>b?c=30:c=40;
答案 0 :(得分:7)
你被优先权所困扰。 ?:
的优先级非常低,但不低于=
或,
(请参阅operator precedence table)。
您的代码被解析为:
(a>b ? c=30 : c) = 40;
而不是:
a>b ? c=30 : (c=40);
c=30
周围不需要括号,因为?
和:
就像括号内的括号一样。
信不信由你,(a>b ? c=30 : c) = 40
是有效的C ++(但不是有效的C)。表达式(a>b ? c=30 : c)
是引用变量c
的{{3}},40
已分配给该变量。
答案 1 :(得分:1)
您遇到=
运算符的优先级问题。如果你坚持在三元运算符内部赋值,只需将子表达式包装在括号中:
int d = a > b ? (c = 30) : (c = 40); // explicit precedence
答案 2 :(得分:0)
最后一个:
int a=5,b=4,c;
a>b?c=30:c=40;
失败,因为它试图将40
分配给a>b?c=30:c
,这显然无效。 =
的优先级较低,a>b?c=30:c
是一个有效的表达式(尽管您无法分配给它)。 =
部分中的c=30
有点例外,因为它位于三元运算符的中间,位于?
和:
之间。要解决此问题,您只需在c=40
周围添加括号,以便将其评估为三元运算符的“else”部分的单个值,即a>b?c=30:(c=40);
第二个例子
a>b?c=30:40;
除非c
大于a
,b
为a
且{{1},否则不会向5
分配任何内容}}是b
,就像在这种情况下一样;但请注意,如果4
不大于a
,则不会进行任何分配。
从第一个例子
b
是一个有效的表达式,其值为a>b?30:40
或30
,但您没有对该值执行任何操作,因此当然没有任何用处。
当然,你通常会使用更像的东西:
40
其中c = a>b ? 30 : 40;
将评估为a>b ? 30 : 40
或30
,然后将其分配给40
。但我怀疑你知道这一点,并且只是想知道为什么在上一个例子中c
不被视为三元运算符的'else'部分的单个值。