(C< = y< = z)ISO C中的条件语法?

时间:2014-09-25 11:14:17

标签: c conditional-statements

我已经看到条件语法如下所示,在示例代码中显示了很多,以检查整数值y是否在两个边界xz之间:

if (x <= y <= z) { //... }

我以为我在自己之前使用过这个,但是在一小段代码中运行测试,条件总是评估为真... 现在在这里怀疑自己的记忆,因为我已经确定我之前已经使用过了! ISO C中允许的语法是什么?我只是期望它做一些不应该做的事情吗?

老式的:

if (x >= y && x <= z) { //... } 

仍然有魅力,所以我还没有完全回到召回的蹒跚阶段;)

1 个答案:

答案 0 :(得分:7)

我想所有xyz都是类似intlong的整数类型。对于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)