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

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

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

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

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

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

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

所以不,它与if (0.0 < a && a < 1.0) (也许你可能会从Python同情规则中混淆if (0.0 < a && a < 1.0)不完全相同,但是在C中它会像我上面解释的那样互相渗透。

你可以在一个例子中观察到的差异--- 0.0 < a < 1.0 ==当a == 0.0a true ,其中为(0.0 < a && a < 1.0) == false,对于a == 0.0 ,下面是我的代码(阅读评论):

 #include 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 

检查它的工作@ Ideone

这是否符合我的期望?

不,确实如此

 (0.0 < a) < 1.0 

(0.0 < a)得到01 。 所以你最终得到0 < 1.01 < 1.0评估。

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

例如在Python中,

 a < b < c 

被称为链式比较 ,它相当于:

 (a < b) and (b < c) 

这是否符合我的期望?

不,因为它很简单。 <操作符具有left to right associativity ,如下所示进行检查

 (0.0 < a < 1.0 ) is simply (0.0 < a) < 1.0 

以第二种forms

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

O / P = X

也许我们可以这样思考(只是为了好玩):

 if(0.0  

==>

 if((0.0  

想:

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

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

所以我可以将if(0.0 if(!(0.0

有意思吧?