我最近注意到以下表达式在我的编译器(Clang)中编译:
float a;
if (0.0 < a < 1.0) { ... }
这是否符合我的预期?我希望它的评估与此条件相同:
if (0.0 < a && a < 1.0) { ... }
如果是这样,那么什么时候以及使用哪些其他编译器可以以这种简短形式编写条件?
我最近注意到以下表达式在我的编译器(Clang)中编译:
float a;
if (0.0 < a < 1.0) { ... }
这是否符合我的预期?我希望它的评估与此条件相同:
if (0.0 < a && a < 1.0) { ... }
如果是这样,那么什么时候以及使用哪些其他编译器可以以这种简短形式编写条件?
由于运算符的从左到右的关联性<
,表达式条件(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 同情规则中混淆),但在 C 中,它会像我上面解释的那样相互渗透。
您可以在示例中观察到差异--- 0.0 < a < 1.0
== true
when a
== 0.0
,其中(0.0 < a && a < 1.0)
== false,对于a
== 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
检查它的工作@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
第二种形式
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 <a < 1.0)
==>
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))
很有趣,对吧?