2014-02-20 1 views
0

я пытаюсь проверить, является ли это равным нулюGCC: предложить круглые скобки вокруг сравнения круглые скобки не в состоянии решить себе

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

!= имеет более высокий приоритет, чем &, так что ваш код действительно делает то же самое, как:

if ((long)Address & ((~(sizeof(long)-1)) != 0)) 
        ^      ^

НКУ предполагает, что это может быть ошибка, которая это возможно. Вы бы хотели:

if (((long)Address & (~(sizeof(long)-1))) != 0) 
    ^         ^
+0

Спасибо, что спасли мой день ... – Vineet1982

+0

@hacce Ум. этот график имеет '! =' * выше * '&', если вы не предполагаете, что график находится в низком-высоком порядке, а это не так. – WhozCraig

+0

Операторы @hacce C в порядке приоритета (от самого высокого до самого низкого). – Vineet1982

1

Подставьте скобки вокруг (long)Address & (~(sizeof(long)-1)) в if заявление.

if (((long)Address & (~(sizeof(long)-1))) != 0){ 
+0

Тогда это всегда неверно/недействительно – Vineet1982

+0

Тогда что вы хотите сделать? – haccks

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"); 
} 
+0

Ваш ответ также верный, но для проверки мне нужно! = 0 – Vineet1982

+0

@ Vineet1982 На всякий случай когда-нибудь 0! = 0, вы хотите быть абсолютно уверены? Последний фрагмент в этом определяется как то, что делает вторая. Если вы подтвердите, вы имеете в виду умиротворить некоторого обозревателя кода, который не знает C от A, B или мороженого, но, но нормально. – WhozCraig

0

Хотя другие ответы обратились к ошибке компилятора, вы можете обойти эту проблему с:

if ((uintptr_t) Address % sizeof(long)) … 

(Чтобы получить uintptr_t, включают в себя <stdint.h>. И, если вы используете C 2011, вы можете заменить sizeof(long) на _Alignof(long).)

+0

Это, вероятно, то, что он хотел сделать, но с '~', это действительно то, что он делает? –

+0

@MarcGlisse: Хороший вопрос, но кто может сказать со всеми круглыми скобками и отсутствием документации? –