首页 > 解决方案 > 三元运算符中的赋值

问题描述

对于三元运算符,为什么以下编译:

a > b ? a=4 : ' ';

但是这个没有:

a > b ? ' ' : b=4;

左值需要作为赋值的左操作数

也就是说,是什么使案例与分配true案例不同?false

标签: cconditional-operator

解决方案


它与条件运算符的正式定义有关。从C 标准的第 6.5.15 节:

conditional-expression:
  logical-OR-expression
  logical-OR-expression ? expression : conditional-expression

条件的第二个子句可以是任何表达式,而第三个子句只能是一个条件表达式(其中 as assignment 不是)。换句话说,条件运算符?:的优先级高于赋值运算符=

所以这:

a > b ? a=4 : ' '

与此相同:

(a > b) ? (a=4) : (' ')

但是这个:

a > b ? ' ' : b=4;

与此相同:

((a > b) ? (' ') : b)=4;

并且不能将条件运算符的结果分配给(即它不是左值),因此会出现错误。

如果添加括号,您可以获得编译的内容:

a > b ? ' ' : (b=4);

当然,这些语句看起来不是条件的最佳用例,可能应该重写为:

if (a>b) a=4;

和:

if (a<=b) b=4;

推荐阅读