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

Tob*_*oby 1 c conditional-statements

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

if (x <= y <= z) { //... }
Run Code Online (Sandbox Code Playgroud)

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

老式的:

if (x >= y && x <= z) { //... } 
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 8

我想这一切x,y,z 一些整型像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)