-3
#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会显示错误以及如何修复它?

4

3 回答 3

8

它与操作员排序有关。编译器认为你在​​做什么是

(a ? b = 3 : b) = 4

这显然是不正确的。

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

b = a ? 3 : 4;
于 2013-08-19T11:24:13.233 回答
1

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

a ? b = 3 : b = 4;

被编译器解释为

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

类似于等价

3 = 4;

这是错误的。
您声称我已将 lvalue 作为 b,这是错误的!b将绑定到?:运算符并通过语句参与评估 r 值

 a ? b = 3 : b;

因此,您将 r 值 ( 3) 分配给 r 值 ( 4)!
b用作 l 值,您可以这样做

b = a ? 3 : 4;

这个答案还可以帮助您了解运算符与操作数的绑定?:

于 2013-08-19T11:47:56.433 回答
-2

以下编译:

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

我会给你一个很长的故事,关于没有明确地为你的依赖加上括号会导致代码中的致命问题。但这就像在汽车上系安全带一样——很多人只是在发生非常混乱的事故之前拒绝相信这是值得的。

于 2013-08-19T11:34:10.927 回答