海湾合作委员会:建议围绕比较括号的括号不能解决自己

时间:2014-02-20 21:24:20

标签: c gcc mingw parentheses

我试图检查这是否等于零

//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]

4 个答案:

答案 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)。)