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

标签 c if-statement expression conditional-statements

我最近注意到以下表达式在我的编译器 (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/

相关文章:

c - 在 TCP 套接字连接期间,连接被对等方重置?

c - 将 uint32* 添加到 uint32

java - 如何使用带有多个参数的 switch()?

hadoop - 尼菲 : capturing the middle section of a filename

c# - 动态 LINQ,Select 函数,适用于 Enumerable,但不适用于 Queryable

c - 创建 32 位位掩码的最有效方法

c - 编译器如何知道我的 main 函数在哪里?

if-statement - 检查 "if"语句中的所有条件?

javascript - PDF 表单的简短 JS 脚本缺少语句

CSS: 表达式(使用百分比和像素来计算)