我最近注意到以下表达式在我的编译器(Clang)中编译:
float a;
if (0.0 < a < 1.0) { ... }
这是否符合我的期望?我希望它的评估与这个条件相同:
if (0.0 < a && a < 1.0) { ... }
如果是这样,那么从何时以及与其他编译器一起编写这种简短形式的条件是什么?
答案 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
== a
,0.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)
会产生0
或1
。因此,您最终会对0 < 1.0
或1 < 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))
有意思,对吧?