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.0
时a
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)
得到0
或1
。 所以你最终得到0 < 1.0
或1 < 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
有意思吧?