(val1> val2> val3)在C中是否有效?

时间:2016-07-28 17:27:24

标签: c

我在制作一个函数的过程中在C语言中乱七八糟,不知何故最终得到了这样的比较:

if (sizeAllocated > type_get_binary_size(data) > spaceAvailable)

(对我来说)意想不到的事情就是编译时没有警告(使用ARM的IAR编译器,IAR扩展的C99标准)。
这看起来不应该是有效的C(至少它不是我现在能想到的任何其他语言的有效比较),一些大师可以帮助我阐明这是否是某些IAR特定的怪癖或如果它的实际标准C太过模糊,不能包含在任何常见的教程中?

2 个答案:

答案 0 :(得分:4)

这是有效的代码,但它无法达到预期效果。

>运算符是左关联的,因此表达式实际上变为:

((sizeAllocated > type_get_binary_size(data)) > spaceAvailable)

如果条件为假,则内部部分将评估为0;如果条件为真,则评估为1。然后将此值与spaceAvailable进行比较。

在C中,比较运算符的结果具有整数类型,因此将此结果与整数进行比较是有效的。

所以你实际做的是0 > spaceAvailable1 > spaceAvailable,具体取决于第一个条件评估的方式。

你可能想要的是:

int size = type_get_binary_size(data);
if ((sizeAllocated > size) && (size > spaceAvailable))

请注意,函数调用首先在if之前完成,因此在条件函数中不会调用它两次。

答案 1 :(得分:2)

>运算符是左关联的,因此A > B > C 解析(A > B) > CA > B评估为0或1,因此您基本上比较0 > C1 > C