C中的化合物条件:if(0.0 <a <1.0)

时间:2013-07-26 10:09:35

标签: c if-statement expression conditional-statements

我最近注意到以下表达式在我的编译器(Clang)中编译:

float a;
if (0.0 < a < 1.0) { ... }

这是否符合我的期望?我希望它的评估与这个条件相同:

if (0.0 < a && a < 1.0) { ... }

如果是这样,那么从何时以及与其他编译器一起编写这种简短形式的条件是什么?

4 个答案:

答案 0 :(得分:12)

由于<运算符从左到右的关联性,表达式条件(0.0 < a < 1.0)表示((0.0 < a) < 1.0) == 1 < 1.0 {{1取决于0 < 1.0的值。

所以不,它与a不一样(也许你可能会对Python同情规则感到困惑),但在C语言中,它会像我上面解释的那样互相渗透。

if (0.0 < a && a < 1.0) == 0.0 < a < 1.0 true == a0.0 == (0.0 < a && a < 1.0)a == false ,对于0.0 == #include<stdio.h> void print_(int c){ c ? printf("True \n"): printf("False \n"); } int main(void){ float a = 0.0f; print_(0.0f < a < 1.0f); // 0.0 < 0.0 < 1.0f == 0 < 1.0f == True print_(0.0f < a && a < 1.0f); // 0.0f < 0.0f && ... == False && ... = False return 0; } ,以下是我的代码(阅读评论):

True 
False

输出:

{{1}}

检查其工作@ Ideone

答案 1 :(得分:10)

  

这是否符合我的期望?

不,它确实

(0.0 < a) < 1.0

(0.0 < a)会产生01。因此,您最终会对0 < 1.01 < 1.0进行评估。

请注意,在某些其他语言中,它可以满足您的期望。

例如在Python中,

a < b < c

称为链式比较,它等同于:

(a < b) and (b < c)

答案 2 :(得分:3)

这是否符合我的期望?

不,因为它非常简单。 <运营商正在检查left to right associativity,如下所示

(0.0 < a < 1.0 ) is simply

(0.0 < a) < 1.0

以第二种形式

int main()
{
        float a = 8.4;
        if (0.0 < a && a < 9) //same as ( 0.0 < a) && (a < 9)
        printf("x");
}

O / P = X

答案 3 :(得分:1)

也许我们可以用这种方式思考(只是为了好玩):

if(0.0 <a < 1.0)

==&GT;

if((0.0 <a)<1.0)

想:

如果0.0 < a == true,则(true <1.0) == false

否则0.0 < a == false,然后是(false <1.0) == true

所以我可以将if(0.0 <a <1.0)翻译成if(!(0.0<a))

有意思,对吧?