以下宏用法有什么问题?

时间:2013-10-07 16:40:49

标签: c syntax macros compiler-errors

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

2 个答案:

答案 0 :(得分:3)

你错过了另外一个括号:

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

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

答案 1 :(得分: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