三元运算符中的赋值
对于三元运算符,为什么会编译以下内容:
a > b ? a=4 : ' ';
但这个没有:
a > b ? ' ' : b=4;
a > b ? ' ' : b=4;
左值需要作为赋值的左操作数
也就是说,是什么使这种true情况与false分配的情况不同?
回答
它与条件运算符的正式定义有关。来自C 标准的第 6.5.15 节:
conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression
条件的第二个子句可以是任何表达式,而第三个子句只能是条件表达式(其中赋值不是)。换句话说,条件运算符的?:优先级高于赋值运算符=。
所以这:
a > b ? a=4 : ' '
是不是和这个一样:
(a > b) ? (a=4) : (' ')
但是这个:
与此相同:
((a > b) ? (' ') : b)=4;
并且不能将条件运算符的结果分配给(即它不是左值),因此您会收到错误消息。
如果添加括号,您可以获得编译的内容:
a > b ? ' ' : (b=4);
当然,这些语句看起来不是条件语句的最佳用例,应该重写为:
if (a>b) a=4;
和:
if (a<=b) b=4;