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

在if声明中,我想包含一个范围,例如:


if(10 < a < 0)

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


if(a<10 && a>0)

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


子衿沉夜
浏览 450回答 3
3回答

潇湘沐

请注意,原始版本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恰好不是这些语言之一。)

幕布斯6054654

第一个进行比较,然后将第一个结果与第二个值进行比较。在这种情况下,操作员组从左到右分组,所以等效于(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))&nbsp; &nbsp; // in rangeelse&nbsp; &nbsp; // out of range.曾经这是体面的汇编语言编程的主要内容。我怀疑许多人是否会再做(我当然不这样做)。

MYYA

如上所述,您必须拆分支票。从编译器的角度考虑它,它一次只看一个运算符。10 <a =是或否。然后执行True / False <0,这没有任何意义。
打开App,查看更多内容
随时随地看视频慕课网APP