表达式中括号的奇怪反应

时间:2013-05-17 15:26:50

标签: c

我已经多次检查了这个......

int bla(int);

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

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

然而,有时(1)完美有效,有时不能,但我无法解释。 我在C写作。

4 个答案:

答案 0 :(得分:2)

这是因为operator precedence<的优先级高于=

if (x = bla(2) < 0)

会将blah(2) < 0的值(10分配给x

答案 1 :(得分:2)

你需要在C#,C和C ++中注意=

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

它的优先级也低于&lt;。

所以在(1)中你要分配bla(2)&lt;的结果。 0到x,因此x将为true或false(或者更正式地说,x的类型为true或false)。 if语句对x的值进行操作; “是x是真还是假”。

在(2)中你使x取值为bla(2),这是一个值为x的表达式,你检查它是否小于零。 if语句在返回问题“x小于零”时运行。

答案 2 :(得分:2)

两个陈述不同的原因是运营商优先......

<的优先级高于=

这意味着

if (x = bla(2) < 0) 

评估如下:blah(2)的返回值与零进行比较,因为<的优先级高于'='。如果小于零则为真结果,否则为假。然后将此布尔值隐式转换为整数并分配给x。因此,在此语句中,x为true或false,x的值用于评估if()条件。

声明

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

更改优先顺序,因为x的赋值现在被括号括起来,所以将首先完成。因此,x被赋值为blah(2)。然后比较x的值,如果小于零则if()块运行。

我认为,从你的问题来看,你试图做的却是......

int tmp = blah(2);
if(tmp < 0)
    x = tmp;

答案 3 :(得分:1)

我相信你首先要做的是x =真或假。因为它评估bla&lt; 0首先。

在第二个你正在制作x = bla。然后评估x&lt; 0