我在制作一个函数的过程中在C语言中乱七八糟,不知何故最终得到了这样的比较:
if (sizeAllocated > type_get_binary_size(data) > spaceAvailable)
(对我来说)意想不到的事情就是编译时没有警告(使用ARM的IAR编译器,IAR扩展的C99标准)。
这看起来不应该是有效的C(至少它不是我现在能想到的任何其他语言的有效比较),一些大师可以帮助我阐明这是否是某些IAR特定的怪癖或如果它的实际标准C太过模糊,不能包含在任何常见的教程中?
答案 0 :(得分:4)
这是有效的代码,但它无法达到预期效果。
>
运算符是左关联的,因此表达式实际上变为:
((sizeAllocated > type_get_binary_size(data)) > spaceAvailable)
如果条件为假,则内部部分将评估为0;如果条件为真,则评估为1。然后将此值与spaceAvailable
进行比较。
在C中,比较运算符的结果具有整数类型,因此将此结果与整数进行比较是有效的。
所以你实际做的是0 > spaceAvailable
或1 > spaceAvailable
,具体取决于第一个条件评估的方式。
你可能想要的是:
int size = type_get_binary_size(data);
if ((sizeAllocated > size) && (size > spaceAvailable))
请注意,函数调用首先在if
之前完成,因此在条件函数中不会调用它两次。
答案 1 :(得分:2)
>
运算符是左关联的,因此A > B > C
解析为(A > B) > C
。 A > B
评估为0或1,因此您基本上比较0 > C
或1 > C
。