-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();
}
4

2 回答 2

3

你又少了一个括号:

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

旁注:如果您不必使用宏,请改用函数。

于 2013-10-07T16:41:34.253 回答
1

您打开 3 括号,但只关闭 2。

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

但还有另一个错误。您应该在宏参数周​​围添加括号,否则您可能会感到惊讶。

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

编辑:错误示例

调用

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
于 2013-10-07T16:51:16.867 回答