首页 > 解决方案 > 条件运算符的结果是左值还是右值?

问题描述

我们知道条件运算符返回一个左值,如果它Expr2Expr3是相同类型的左值,否则它返回一个右值:

int main(){
   int a = 0, b = 0;
   (a == 1 ? a : b) = 1; // C++ OK. C: error. lvalue needed

   return 0;
}

这是C上的输出:

main.c: In function ‘main’:
main.c:8:20: error: lvalue required as left operand of assignment
(a == 1 ? a : b) = 1;
                ^

标签: cconditional-operator

解决方案


在 C 中,条件运算符的结果1是一个右值(C 标准术语中的“值”),因为 C 2018 6.3.2.1 2 说:

除非是运算符的操作数,sizeof运算符,unary &运算++符,--运算符,或运算符的左操作数.或赋值运算符,将不具有数组类型的左值转换为存储在指定对象中的值(并且不再是左值);…</p>

因此,虽然条件运算符的结果是它的第二个或第三个操作数,但该操作数已被转换为一个值并且不再是左值。

正如MM所说,您可以通过选择操作数的地址然后应用来获得与选择左值相同的效果*

*(a == 1 ? &a : &b) = 1;

脚注

1条件运算符的结果不是返回值,因为不涉及函数调用,所以没有调用和返回,只是表达式求值。


推荐阅读