我真的检查过很多次了......
int bla(int);
if (x = bla(2) < 0) (1)
if ((x = bla(2)) < 0) (2)
我想要做的是检查 bla(int) 的返回值是否为负,然后将其保留为 x。
然而,有时(1)工作得很好,有时不能,但我无法解释。我正在用 C 语言写作。
我真的检查过很多次了......
int bla(int);
if (x = bla(2) < 0) (1)
if ((x = bla(2)) < 0) (2)
我想要做的是检查 bla(int) 的返回值是否为负,然后将其保留为 x。
然而,有时(1)工作得很好,有时不能,但我无法解释。我正在用 C 语言写作。
这两个语句不同的原因是由于运算符优先级......
<
具有比 高得多的优先级=
。
这意味着
if (x = bla(2) < 0)
计算如下: 的返回值blah(2)
与零比较,因为<
它的优先级高于 '='。如果小于零则结果为真,否则为假。然后将此布尔值隐式转换为整数并分配给 x。因此,在此语句中,x 要么为真,要么为假,x 的值用于评估if()
条件。
该声明
if ((x = bla(2)) < 0)
更改优先顺序,因为赋值x
现在被括号括起来,所以将首先完成。所以 x 被赋值为blah(2)
。然后比较 x 的值,如果小于零,则if()
块运行。
我认为,从你的问题来看,你想要做的是......
int tmp = blah(2);
if(tmp < 0)
x = tmp;
在 C#、C 和 C++ 中,您需要小心使用 =
= 是赋值运算符,而不是比较
它的优先级也低于 <。
因此,在 (1) 中,您将 bla(2) < 0 的结果分配给 x,因此 x 将是真或假(或者,更正式地,对 x 的类型进行真或假的转换)。if 语句对 x 的值进行操作;“x 是真还是假”。
在 (2) 中,您使 x 取 bla(2) 的值,这是一个具有值 x 的表达式,您正在检查它是否小于零。if 语句对问题“x 小于零”的返回进行操作。
我相信你首先让 x = true 或 false。因为它首先评估 bla < 0。
在第二个中,您正在制作 x = bla。然后评估 x < 0。