#define如何工作? CUBE(y)y *(y * y)的奇怪结果

#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4); printf("value of j = %d",j); getch(); } 

此代码的输出为-26 。 我只是想知道这段代码如何给出-26作为输出。 #define如何在此代码中工作。 我知道变量或方法的#define永久修复值,但不知道这对CUBE工作原理。 有人可以一步一步地描述这个,简单的方法。

它确实:

 j = -2 + 4 * (-2 + 4 * -2 + 4) 

CUBE的更正确定义是

 #define CUBE(y) ((y)*(y)*(y)) 

您应该使用-E标志自己解决:

gcc test.c -E

 # 1 "test.c" # 1 "" # 1 "test.c" main() { int j; j = -2+4*(-2+4*-2+4); // <-- Check this substitution printf("value of j = %d",j); getch(); } 

对于立方体数字,您应该使用()来更改评估的优先级和顺序: -

#define CUBE(y) (( y )*( y )*( y ))

使用-E标志后会给出:

j = (( -2+4 )*( -2+4 )*( -2+4 ));

我知道变量或方法的#define永久修复值

你无法知道,因为它是错的 。 预处理器通过令牌替换来工作 。 每当它看到令牌序列CUBE(some tokens)它就会替换它

  some tokens * ( some tokens * some tokens ) 

现在自己用-2+4替换一些令牌并进行数学计算。

预处理器甚至不知道变量或对象或方法是什么。 它纯粹根据预处理令牌 (小块字符;有关详细信息,请参阅ISO C标准)进行操作。

它按原样扩展:

 -2+4*(-2+4*-2+4) = -2 +4(-6)= -26 

使用()将其固定在y周围

 #define CUBE(y) ((y)*(y)*(y)) 

所以你会得到:

 ((-2+4) * (-2+4) * (-2+4))