左值作为条件运算符中赋值的左操作数

时间:2013-08-19 11:21:09

标签: c++ c gcc compiler-errors conditional-operator

#include <stdio.h>
int main()
{
        int a = 1, b;
        a ? b = 3 : b = 4;
        printf("%d, %d", a, b);
        return 0;
}

[user@localhost programs]$ gcc -Wall vol.c
vol.c: In function ‘main’:
vol.c:5:16: error: lvalue required as left operand of assignment
  a ? b = 3 : b = 4;
                ^

我已将左值作为b给出了为什么gcc显示错误以及如何修复它?

3 个答案:

答案 0 :(得分:8)

它与操作员排序有关。编译器认为你正在做的是

(a ? b = 3 : b) = 4

这显然是不正确的。

相反,为什么不将b放在左侧,只获取要使用条件表达式赋值的值,如

b = a ? 3 : 4;

答案 1 :(得分:1)

条件运算符(?:)总是在某个条件变为true或false的基础上返回一个值。换句话说,可以说?:总是返回r值。并且r值永远不会放在赋值表达式的左侧。声明

a ? b = 3 : b = 4;

由编译器解释为

(a ? b = 3 : b) = 4;

类似于等同

3 = 4;

这是错误的。
您声称​​我已将左值作为b ,这是错误的! b将绑定到?:运算符,并通过语句

参与评估r值
 a ? b = 3 : b;

因此您将r值(3)分配给r值(4)!
要使用b作为l值,您可以通过执行

来执行此操作
b = a ? 3 : 4;

这个answer也可以帮助您理解运算符与操作数?:的绑定。

答案 2 :(得分:-2)

以下编译:

#include <stdio.h>
int main()
{
    int a = 1, b;
    a ? ( b = 3 ) : ( b = 4 );
    printf("%d, %d", a, b);
    return 0;
}

我会告诉你一个很长的故事,关于如何不明确地将你的依赖关系括起来会导致代码中的致命问题。但就像在车上系安全带一样 - 很多人只是拒绝相信它是值得的,直到它们处于非常混乱的事故中。