为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
子衿沉夜 2020-02-02 14:23:41
在if声明中,我想包含一个范围,例如:if(10 < a < 0)但是这样做,我得到一个警告“毫无意义的比较”。但是,这可以正常工作而没有任何警告:if(a<10 && a>0)是否可以在C中实现第一种情况?
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

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


该<运营商联营左到右,就像+操作。因此,正如a + b + c真正的意思(a + b) + c,a < b < c真正的意思(a < b) < c。所述<,如果条件为假,1,如果它是真实的操作者产生的0 int值。因此,您正在测试0小于c还是1小于c。


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


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


a < b && b < c

(有些语言(包括Python)在数学中通常是a < b < c手段,即手段a<b && b<c,而C恰好不是这些语言之一。)


查看完整回答
反对 回复 2020-02-02
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

第一个进行比较,然后将第一个结果与第二个值进行比较。在这种情况下,操作员组从左到右分组,所以等效于(10<a) < 0。它给出的警告确实是因为<始终会产生0或1。警告是告诉您,第一次比较的结果永远不会小于0,因此第二次比较将始终产生false。


即使编译器不会抱怨它,第二点也没有太大的改进。一个数字如何同时小于0但大于10?理想情况下,编译器会警告您该条件始终为假。想必你想0<a<10和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.

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


查看完整回答
反对 回复 2020-02-02
?
MYYA

TA贡献1868条经验 获得超4个赞

如上所述,您必须拆分支票。从编译器的角度考虑它,它一次只看一个运算符。10 <a =是或否。然后执行True / False <0,这没有任何意义。


查看完整回答
反对 回复 2020-02-02
  • 3 回答
  • 0 关注
  • 444 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信