下述代码中左值错误的原因是什么?

时间:2020-11-11 05:11:26

标签: c conditional-operator lvalue

#include <stdio.h>
int main(void){
   int n = 0, y = 1;
   y == 1 ? n = 0 : n = 1;
   if (n)
       printf("YES");
   else
       printf("NO");
   return 0;
  }

有人可以解释为什么三元运算符的行出现lvalue错误。我对lvalue是一个非常抽象的想法。让我给出我的抽象,如果我错了,请纠正我。 lvalue通常是地址,或者我们可以说存储常量值的变量,而变量或常量的值是rvalue。但是我不明白为什么三元运算符的赋值部分在lvalue处出现n = 0 : n = 1错误。如果我能正确理解我的代码出了什么问题,那将非常有帮助。

2 个答案:

答案 0 :(得分:6)

三元运算符?:的优先级高于赋值运算符=。因此,您的表达式解析为:

(y == 1 ? n = 0 : n) = 1;

这会在分配的左侧为您提供一个表达式,该表达式不是左值,因此不可分配。

三元运算符求值为第二部分或第三部分的值,而这些值是您要分配给n的值,因此您可以将其写为:

n = y == 1 ? 0 : 1;

或者您可以反转条件并完全摆脱三元:

n = y != 1;

答案 1 :(得分:1)

原因是三元运算符的优先级高于赋值。因此,表达式就像您写的一样被解析:

(y == 1 ? n = 0 : n) = 1;

这不是有效的赋值,因为条件运算符的结果是一个右值,而不是一个左值,因此您无法为其赋值。

您可以通过在作业周围添加括号来解决问题。

y == 1 ? (n = 0) : (n = 1);

但是,由于您要分配给相同的变量,因此更普通的写法是:

n = y == 1 ? 0: 1;

您还可以利用比较运算符的结果是布尔值01的事实,因此您可以简单地编写:

n = y != 1;