2013-10-07 5 views
-2

isPowerof(2) в main() вызывает ожидается); ошибка ... что в этом плохого?Что происходит со следующим использованием макросов?

#include<stdio.h> 

#define isPowerof2(n) (!(n & (n-1)) 

int main(){ 
    int n,p; 
    clrscr(); 
    printf("\nEnter the number to be Checked:"); 
    scanf("%d",&n); 
    isPowerof2(n); 
    printf("%d",p); 

getch(); 
} 
+0

Между прочим, выражение в 'isPowerof2' будет означать, что нуль является степенью два, что неправильно. –

ответ

3

Вы пропустили еще один кронштейн:

#define isPowerof2(n) (!(n & (n-1))) 
            ^

Side Примечание: Если вы не должны использовать макрос, используйте функцию вместо этого.

1

Открываешь 3 скобку, но близко к этому только 2.

#define isPowerof2(n) (!(n & (n-1))) 

но есть еще одна ошибка. Вы должны добавить круглые скобки вокруг своих макропараметров, иначе у вас могут быть сюрпризы.

#define isPowerof2(n) (!((n) & ((n)-1))) 

EDIT: Пример ошибки

Invoke

isPowerOf2(34 >> 1) which is not a power of 2 

потерпит неудачу, потому что в вашем случае без скобок, она будет расширяться по мере

(!(34 >> 1 & (34 >> 1-1))) 
(!(17 & (34 >> 0))  // shift is lower priority than subtraction 
(!(17 & 34)) 
(!0) 
1 

, который, очевидно, неверно ,

Реальное значение с фиксированной макрокомандой

(!((34 >> 1) & ((34 >> 1)-1))) 
(!(17 & (17-1))  // shift is lower priority than subtraction 
(!(17 & 16)) 
(!16) 
0 
Смежные вопросы