链接多个大于/小于运算符
在if
语句中,我想包含一个范围,例如:
if(10 < a < 0)
但通过这样做,我得到一个警告“毫无意义的比较”。 但是,这没有任何警告,工作正常:
if(a>10 && a<0)
第一种情况可以在C中实现吗?
请注意,原始版本完全合法; 它只是没有做你可能(合理地)认为它做的事情。 你很幸运,编译器认为它是一个可能的错误并警告你。
<
运算符从左到右关联,就像+
运算符一样。 因此,正如a + b + c
实际上意味着(a + b) + c
, a < b < c
实际上意味着(a < b) < c
。 如果条件为假,则<
运算符产生的int值为0,如果为真,则为1。 所以你要么测试0是否小于c,或者1是否小于c。
在不太可能的情况下,这确实是你想要做的,添加括号可能会使警告无声。 它还会让任何读取你的代码的人放心,你知道自己在做什么,所以他们不会“修复”它。 (同样,这仅适用于您真正想要的不太可能的事件(a < b) < c)
。)
检查a
是否小于b
且b
小于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.
有一段时间,这是体面的汇编语言编程的主要内容。 我怀疑很多人不再这样做(我当然不会这样做)。
不,这不是if语句的有效语法,它应该具有有效的常量表达式,或者可能在其中包含逻辑运算符,并且仅当括号中的表达式求值为true或非零值时才执行