繁体   English   中英

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

[英]Chaining multiple greater than/less than operators

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

if(10 < a < 0)

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

if(a<10 && a>0)

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

请注意,原始版本if(10 < a < 0)是完全合法的。 它只是没有做你可能(合理地)认为它做的事情。 您很幸运,编译器将其识别为可能的错误并警告您。

<运算符从左到右关联,就像+运算符一样。 所以就像a + b + c真的意味着(a + b) + c一样, a < b < c真的意味着(a < b) < c <运算符在条件为假时产生一个 int 值,如果条件为真,则为 1。 因此,您要么测试 0 是否小于 c,要么测试 1 是否小于 c。

在不太可能的情况下,这确实是您想要做的,添加括号可能会使警告静音。 它还将让以后阅读您的代码的任何人放心,您知道自己在做什么,因此他们不会“修复”它。 (同样,这仅适用于您真正想要(a < b) < c)的不太可能发生的情况。)

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

a < b && b < c

(有些语言,包括 Python,其中a < b < c表示a<b && b<c ,就像它在数学中通常所做的那样。C 恰好不是这些语言之一。)

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

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

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

尽管编译器不会抱怨它,但第二个并没有太大的改进。 一个数如何同时小于 0,但大于 10? 理想情况下,编译器会警告您条件始终为假。 大概你想要0<a<10a>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 < a = 真或假。 然后它会执行 True/False < 0,这是没有意义的。

不,这不是 if 语句的有效语法,它应该有一个有效的常量表达式,或者其中可能有逻辑运算符,并且仅在括号中的表达式计算结果为真或非零值时执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM