下面提到的代码中左值错误的原因是什么?

What is the cause of the lvalue error in the below mentioned code?

#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。如果我能正确理解我的代码有什么问题,那将非常有帮助。

三元运算符 ?: 的优先级高于赋值运算符 =。所以你的表达式解析为:

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

这为您在赋值左侧提供了一个表达式,该表达式不是左值,因此不可赋值。

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

n = y == 1 ? 0 : 1;

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

n = y != 1;

原因是三元运算符的优先级高于赋值。所以表达式被解析为就好像你写的一样:

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

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

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

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

但是由于您要分配给同一个变量,所以更正常的写法是:

n = y == 1 ? 0: 1;

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

n = y != 1;