C中的复合条件:if(0.0 <a <1.0)

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== truewhen 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)产量01.所以你最终得到0 < 1.01 < 1.0评估.

请注意,在其他一些语言中,它可以满足您的期望.

例如在Python中,

a < b < c
Run Code Online (Sandbox Code Playgroud)

被称为链式比较,它相当于:

(a < b) and (b < c)
Run Code Online (Sandbox Code Playgroud)