4

我最近注意到以下表达式在我的编译器(Clang)中编译:

float a;
if (0.0 < a < 1.0) { ... }

这是否符合我的预期?我希望它的评估与此条件相同:

if (0.0 < a && a < 1.0) { ... }

如果是这样,那么什么时候以及使用哪些其他编译器可以以这种简短形式编写条件?

4

4 回答 4

13

由于运算符的从左到右的关联性<,表达式条件(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,其中(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

于 2013-07-26T10:10:48.380 回答
11

这是否符合我的预期?

不,确实如此

(0.0 < a) < 1.0

(0.0 < a)产量01。所以你最终拥有0 < 1.01 < 1.0评估。

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

例如在 Python 中,

a < b < c

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

(a < b) and (b < c)
于 2013-07-26T10:11:30.667 回答
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

于 2013-07-26T10:13:55.247 回答
1

也许我们可以这样想(只是为了好玩):

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))

很有趣,对吧?

于 2013-07-26T11:43:42.560 回答