#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))