我最近注意到以下表达式在我的编译器 (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
什么时候a
== 0.0
,其中 (0.0 < a && a < 1.0)
== 假,对于 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
关于C 中的复合条件 : if (0. 0 < a < 1.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17878632/