为什么我需要错误 * 左值作为赋值错误 * 的左操作数?
#include <stdio.h>
int main()
{
int x = 2, y = 2;
float f = y + x /= x / y;
printf("%d %f\n", x, f);
return 0;
}
为什么这里的输出为false?
#include <stdio.h>
int main()
{
int x = 1, y = 2;
if (x && y == 1)
printf("true\n");
else
printf("false\n");
}
我以为当两个值都不为0时,&&的结果总是1
2条答案
按热度按时间kmbjn2e31#
C makes a distinction between lvalues and rvalues. Here's a snippet that sums up the difference:
An lvalue (locator value) represents an object that occupies some identifiable location in memory (i.e. has an address).
On this line, you violate this by mixing the two types:
There is nowhere in memory specified to hold the result of
x / y
. You can read more about this on many Stack pages .As for the second question,
if (x && y == 1)
is false becausey == 1
is false. The statement is equivalent tox && 0
.9q78igpj2#
你可以在SO上找到多个答案来描述左值是什么(一个指定对象的表达式,而不仅仅是一个值),以及解决“左值必需”错误的其他示例。例如,
基本上,错误意味着程序包含赋值或组合运算符/赋值表达式,其左边的操作数没有指定对象,因此赋值部分是无意义的。
有时候,出现这种情况是因为运算符优先级产生的运算顺序与代码作者假定或想要的不同,除非您提供的代码是故意错误的,否则情况就是如此。
,问题出在初始化器表达式
y + x /= x / y
上。据推测,其意图是将其计算为y + (x /= (x / y))
,其具有明确定义的值和对x
的值的明确定义的副作用。然而,赋值和运算赋值运算符(如
/=
)的优先级非常低,因此该表达式 * 实际上 * 被解释为等效于(y + x) /= (x / y)
。y + x
不是左值(它可以求值,但不能指定对象),因此它不是/=
运算符的可接受左操作数。这就是错误的原因。您的第二个问题涉及到另一个运算符优先级问题。
&&
运算符的优先级低于==
运算符,因此x && y == 1
等效于x && (y == 1)
。在您的初始化过程中,&&
右边的操作数计算结果为0,因此整个表达式的计算结果为0。如果目的是测试x && y
的计算结果是否为真实值,则这是搬起石头砸自己的脚,因为省去X1 M13 N1 X部分既更常规又产生期望的结果。