下面提到的代码中左值错误的原因是什么?
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;
您还可以利用比较运算符的结果是布尔值这一事实,即 0
或 1
,因此您可以简单地编写:
n = y != 1;
#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;
您还可以利用比较运算符的结果是布尔值这一事实,即 0
或 1
,因此您可以简单地编写:
n = y != 1;