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

Ana*_*sak 2 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;
  }
Run Code Online (Sandbox Code Playgroud)

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

dbu*_*ush 6

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

(y == 1 ? n = 0 : n) = 1;
Run Code Online (Sandbox Code Playgroud)

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

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

n = y == 1 ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)

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

n = y != 1;
Run Code Online (Sandbox Code Playgroud)