链接多个大于/小于运算符

时间:2011-08-05 19:30:57

标签: c

if语句中,我想要包含一个范围,例如:

if(10 < a < 0)

但是通过这样做,我得到了一个警告“毫无意义的比较”。但是,这没有任何警告就可以正常工作:

if(a>10 && a<0)

第一种情况是否可以在C中实现?

6 个答案:

答案 0 :(得分:28)

请注意,原始版本完全合法;它只是没有做你可能(合理地)认为它做的事情。你很幸运,编译器认为它是一个可能的错误,并警告你。

<运算符从左到右关联,就像+运算符一样。正如a + b + c真正意味着(a + b) + ca < b < c实际上意味着(a < b) < c。如果条件为假,则<运算符的int值为0,如果为真,则为1。所以你要么测试0是否小于c,或者1是否小于c。

在不太可能的情况下,这确实是你想要做的,添加括号可能会使警告无声。它还会让任何读取你的代码的人放心,你知道自己在做什么,所以他们不会“修复”它。 (同样,这仅适用于真正想要(a < b) < c)的不太可能的事件。)

检查a是否小于bb小于c的方法是:

a < b && b < c

答案 1 :(得分:6)

这是不可能的,你必须像在案例2中那样拆分支票。

答案 2 :(得分:5)

不,这是不可能的 您必须通过拆分两个条件检查来使用第二种方式。

答案 3 :(得分:2)

第一个进行一次比较,然后比较第一个值到第二个值的结果。在这种情况下,运算符组从左到右,因此它等同于(10<a) < 0。它给你的警告真的是因为<总是会产生0或1.警告告诉你第一次比较的结果永远不会小于0,所以第二次比较总是会产生错误。

尽管编译器不会抱怨它,但第二个并没有太大改进。一个数字如何同时小于0,但大于10?理想情况下,编译器会向您发出警告,指出条件始终为false。大概你想要0<a<10a>0 && a<10

只使用一次比较就可以得到第二种效果:只有当数字在0..10范围内时,if ((unsigned)a < 10)才会生效。范围比较通常可以简化为与以下代码进行单一比较:

if ((unsigned)(x-range_start)<(range_end-range_start))
    // in range
else
    // out of range.

这曾经是体面的汇编语言编程的主要内容。我怀疑很多人不再这样做(我当然不会这样做)。

答案 4 :(得分:0)

如上所述,您必须拆分支票。从编译器的角度考虑它,它一次查看一个运算符。 10&lt; a =真或假。然后它会做真/假&lt; 0,这没有意义。

答案 5 :(得分:-1)

不,这不是if语句的有效语法,它应该有一个有效的常量表达式,或者可能在其中包含逻辑运算符,并且仅当括号中的表达式求值为true或非零值时才执行; / p>