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

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

 if(10 < a < 0) 

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

 if(a>10 && a<0) 

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

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

<运算符从左到右关联,就像+运算符一样。 因此,正如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 

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

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

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

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

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

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

有一段时间,这是体面的汇编语言编程的主要内容。 我怀疑很多人不再这样做(我当然不会这样做)。

如上所述,您必须拆分支票。 从编译器的角度考虑它,它一次查看一个运算符。 10

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