风吹来了 发表于 2020-3-21 15:37:40

C语言,赋值运算符的问题

#include<stdio.h>
int main(void)
{
        int a=1, b=0 ;
        if ( a != 0 || b = 1)
           printf("%d\n",b);
        return 0;
}

编译时显示:        lvalue required as left operand of assignment(中文翻译过来就是赋值运算符左边必须是可赋值的左值)

然后我尝试用括号把b=1括起来,就可以编译成功了。

想问一下有没有大佬是知道为什么

sunrise085 发表于 2020-3-21 15:37:41

这个问题的确是优先级的问题。
a != 0 || b = 1会先判断 a != 0,然后得到结果0,再进行0||b,得到0,最后在进行赋值,而赋值运算符的左侧必须是变量,你这里赋值运算符左侧是定值0。
你应该是打算用比较运算符吧。
#include<stdio.h>
int main(void)
{
      int a=1, b=0 ;
      if ( a != 0 || b == 1)//比较运算符是两个等号,赋值运算符是一个等号
         printf("%d\n",b);
      return 0;
}

BngThea 发表于 2020-3-21 15:45:51

因为运算有优先级
不括起来的话,中间的 0||b会先执行,得到的结果是常数,不能被赋值

ba21 发表于 2020-3-21 15:46:40

逻辑运先 b == 1
赋值 b = 1

该加()的时候加()也没有什么不对。
a != 0 || b = 1 肯定要加()

风吹来了 发表于 2020-3-21 15:49:45

忘了说了,抱歉,刚刚查过C语言运算符优先级表,赋值运算符的优先级低于逻辑运算符,所以会按照逻辑运算符的顺序先执行。但也因为排除了这个优先级的原因,就完全想不出来其他原因了。

iomewin 发表于 2020-3-21 16:03:41

#include<stdio.h>
int main(void)
{
    int a = 1, b = 0;
    if (a || b )
      printf("%d\n", b);
    return 0;
}

我猜是你的思路有问题,我猜你内心想的是: a != 0 或者 b = 1,其中一个条件成立的时候为真,然而
||        称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。        (A || B) 为真。

风吹来了 发表于 2020-3-21 16:18:59

sunrise085 发表于 2020-3-21 15:37
这个问题的确是优先级的问题。
a != 0 || b = 1会先判断 a != 0,然后得到结果0,再进行0||b,得到0,最 ...

谢谢
页: [1]
查看完整版本: C语言,赋值运算符的问题