条件运算符出现意外错误

时间:2011-11-22 04:39:10

标签: c conditional-operator

以下代码编译良好

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;

3 个答案:

答案 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大于aba且{{1},否则

不会向5分配任何内容}}是b,就像在这种情况下一样;但请注意,如果4不大于a,则不会进行任何分配。

从第一个例子

b

是一个有效的表达式,其值为a>b?30:40 30,但您没有对该值执行任何操作,因此当然没有任何用处。

当然,你通常会使用更像的东西:

40

其中c = a>b ? 30 : 40; 将评估为a>b ? 30 : 4030,然后将其分配给40。但我怀疑你知道这一点,并且只是想知道为什么在上一个例子中c不被视为三元运算符的'else'部分的单个值。