-5

我真的检查过很多次了......

int bla(int);

if (x = bla(2) < 0)  (1)
if ((x = bla(2)) < 0) (2)

我想要做的是检查 bla(int) 的返回值是否为负,然后将其保留为 x。

然而,有时(1)工作得很好,有时不能,但我无法解释。我正在用 C 语言写作。

4

4 回答 4

2

这两个语句不同的原因是由于运算符优先级......

<具有比 高得多的优先级=

这意味着

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;
于 2013-05-17T15:32:12.070 回答
2

这是因为运算符优先级<具有比 更高的优先级=

if (x = bla(2) < 0)

导致 的值blah(2) < 0,这将是10,被分配给x

于 2013-05-17T15:28:56.987 回答
2

在 C#、C 和 C++ 中,您需要小心使用 =

= 是赋值运算符,而不是比较

它的优先级也低于 <。

因此,在 (1) 中,您将 bla(2) < 0 的结果分配给 x,因此 x 将是真或假(或者,更正式地,对 x 的类型进行真或假的转换)。if 语句对 x 的值进行操作;“x 是真还是假”。

在 (2) 中,您使 x 取 bla(2) 的值,这是一个具有值 x 的表达式,您正在检查它是否小于零。if 语句对问题“x 小于零”的返回进行操作。

于 2013-05-17T15:30:41.003 回答
1

我相信你首先让 x = true 或 false。因为它首先评估 bla < 0。

在第二个中,您正在制作 x = bla。然后评估 x < 0。

于 2013-05-17T15:30:07.893 回答