我已经看到条件语法如下所示,在示例代码中显示了很多,以检查整数值y
是否在两个边界x
和z
之间:
if (x <= y <= z) { //... }
我以为我在自己之前使用过这个,但是在一小段代码中运行测试,条件总是评估为真... 现在在这里怀疑自己的记忆,因为我已经确定我之前已经使用过了! ISO C中允许的语法是什么?我只是期望它做一些不应该做的事情吗?
老式的:
if (x >= y && x <= z) { //... }
仍然有魅力,所以我还没有完全回到召回的蹒跚阶段;)
答案 0 :(得分:7)
我想所有x
,y
,z
都是类似int
或long
的整数类型。对于NaN != NaN
.....
第一个if (x <= y <= z)
错了。它被解析为if ((x<=y) <= z)
。比较返回一个布尔值,当在某个整数上下文中使用时,该值被提升为0(表示假)或1(表示真)。因此,当x <= y
测试表现为if (1 <= z)
时,相反x > y
,测试相当于if (0 <= z)
当被要求提供所有警告(例如gcc -Wall
)时,一个好的编译器会警告你。
顺便说一下,在不太可能的情况下 - 我从来没有遇到过这种情况,但我从20世纪80年代开始用C代码 - 你的意思是if ((x<=y) <= z)
我觉得代码很奇怪,需要一个明确的评论,或者代码if (((x<=y)?1:0) <= z)