我试图检查这是否等于零
//Address already malloc
void MyCheck (void *Address){
if ( (long)Address & (~(sizeof(long)-1)) != 0 ){
printf("Invalid");
}
}
尝试编译时,请给我:
Error: suggest parentheses around comparison in operand
of '&' [-Werror=parentheses]
答案 0 :(得分:6)
!=
的优先级高于&
,因此您的代码实际上与以下内容相同:
if ((long)Address & ( (~(sizeof(long)-1)) != 0 ) )
^ ^
gcc建议这可能是一个错误,它可能是错误。你想要:
if ( ( (long)Address & (~(sizeof(long)-1)) ) != 0 )
^ ^
答案 1 :(得分:1)
在(long)Address & (~(sizeof(long)-1))
语句中围绕if
括号。
if ( ( (long)Address & (~(sizeof(long)-1)) ) != 0 ){
答案 2 :(得分:1)
!=
的优先级高于&
,所以您实际说的是:
if ((long)Address & ((~(sizeof(long)-1)) != 0)){
printf("Invalid");
}
相反,将括号括在第一部分:
if (((long)Address & (~(sizeof(long)-1))) != 0){
printf("Invalid");
}
但是,在TI-Basic和C中有很多背景知识,我个人会遗漏!= 0
部分:
if ((long)Address & (~(sizeof(long)-1))){
printf("Invalid");
}
答案 3 :(得分:0)
虽然其他答案已解决了编译器错误,但您可以回避以下问题:
if ((uintptr_t) Address % sizeof(long)) …
(要获得uintptr_t
,请添加<stdint.h>
。如果您使用的是C 2011,则可能需要将sizeof(long)
替换为_Alignof(long)
。)