#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
错误。如果我能正确理解我的代码出了什么问题,那将非常有帮助。
答案 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;
您还可以利用比较运算符的结果是布尔值0
或1
的事实,因此您可以简单地编写:
n = y != 1;