MrT*_*rTJ 3 c expression if-statement conditional-statements
我最近注意到以下表达式在我的编译器(Clang)中编译:
float a;
if (0.0 < a < 1.0) { ... }
Run Code Online (Sandbox Code Playgroud)
这是否符合我的期望?我希望它的评估与这种情况相同:
if (0.0 < a && a < 1.0) { ... }
Run Code Online (Sandbox Code Playgroud)
如果是这样,那么何时以及与其他编译器一起编写这种简短形式的条件?
Gri*_*han 12
由于<
运算符从左到右的关联性,表达式条件(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
,其中as (0.0 < a && a < 1.0)
== false,for 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
True
False
Run Code Online (Sandbox Code Playgroud)
检查它的工作@ Ideone
oua*_*uah 10
这是否符合我的期望?
不,确实如此
(0.0 < a) < 1.0
Run Code Online (Sandbox Code Playgroud)
和(0.0 < a)
产量0
或1
.所以你最终得到0 < 1.0
或1 < 1.0
评估.
请注意,在其他一些语言中,它可以满足您的期望.
例如在Python中,
a < b < c
Run Code Online (Sandbox Code Playgroud)
被称为链式比较,它相当于:
(a < b) and (b < c)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1369 次 |
最近记录: |