提问人:jscode 提问时间:8/6/2011 最后编辑:Keith Thompsonjscode 更新时间:10/6/2019 访问量:50770
链接多个大于/小于运算符
Chaining multiple greater than/less than operators
问:
在语句中,我想包含一个范围,例如:if
if(10 < a < 0)
但通过这样做,我会得到一个警告“毫无意义的比较”。但是,这在没有任何警告的情况下工作正常:
if(a<10 && a>0)
第一种情况可以在 C 语言中实现吗?
答:
这是不可能的,您必须像在案例 2 中那样拆分支票。
不,这是不可能的。
您必须使用第二种方式,将两个条件检查拆分。
不,这不是 if 语句的有效语法,它应该有一个有效的常量表达式,或者其中可能有逻辑运算符,并且仅在括号中的表达式计算结果为 true 或非零值时执行
评论
if (1 < 13)
if (10 < 12 && 12 < 13)
(a < b < c)
如上所述,您必须拆分支票。从编译器的角度考虑一下,编译器一次只看一个运算符。10 < A = 真或假。然后它去执行 True/False < 0,这没有意义。
评论
请注意,原始版本是完全合法的。它只是没有做你可能(合理地)认为它做的事情。你很幸运,编译器认为这是一个可能的错误,并警告你。if(10 < a < 0)
运算符从左到右关联,就像运算符一样。所以就像真的意味着,真的意味着。如果条件为 false,运算符将生成 int 值 0,如果条件为 true,则生成 1。因此,您要么测试 0 是否小于 c,要么测试 1 是否小于 c。<
+
a + b + c
(a + b) + c
a < b < c
(a < b) < c
<
在极少数情况下,这确实是您想要做的,添加括号可能会使警告静音。它还会让任何稍后阅读您的代码的人放心,您知道自己在做什么,因此他们不会“修复”它。(同样,这仅适用于您真正想要的不太可能的情况。(a < b) < c)
检查是否小于和小于的方法是:a
b
b
c
a < b && b < c
(有些语言,包括 Python,其中表示 ,就像在数学中一样。C语言恰好不是这些语言之一。a < b < c
a<b && b<c
评论
(a < b) < c
(int) (a < b) < c
(a < b) < c
int
int
第一个值执行一个比较,然后将第一个值的结果与第二个值进行比较。在本例中,运算符从左到右分组,因此它等效于 。它给你的警告实际上是因为总是会产生 0 或 1。警告告诉您,第一次比较的结果永远不能小于 0,因此第二次比较将始终产生 false。(10<a) < 0
<
尽管编译器不会抱怨它,但第二个并没有太大的改进。一个数字怎么能同时小于 0,但大于 10?理想情况下,编译器会给你一个警告,指出条件始终为 false。大概你想要和 .0<a<10
a>0 && a<10
您只能使用单个比较来获得第二个的效果:仅当数字在 0..10 范围内时才为 true。范围比较通常可以简化为单个比较,其代码如下:if ((unsigned)a < 10)
if ((unsigned)(x-range_start)<(range_end-range_start))
// in range
else
// out of range.
曾几何时,这是体面的汇编语言编程的主要内容。不过,我怀疑很多人会这样做(我当然不会这样做)。
评论
(a>10 && a<0)
a
(a>0 && a<10)
<
>