#include<stdio.h>
#include<conio.h>
#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
的工作原理。有人可以一步一步地描述这一点,意味着简单易行。
答案 0 :(得分:8)
它确实:
j = -2 + 4 * (-2 + 4 * -2 + 4)
更正确的CUBE定义是
#define CUBE(y) ((y)*(y)*(y))
答案 1 :(得分:5)
您应该使用 -E
标记自行解决:
的 gcc test.c -E
强> 的
# 1 "test.c"
# 1 "<command-line>"
# 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 ));
答案 2 :(得分:3)
我知道变量或方法的#define永久固定值
你无法知道,因为它是错误。预处理器通过令牌替换工作。每当它看到令牌序列CUBE(some tokens)
时,它就会用
some tokens * ( some tokens * some tokens )
现在自己用-2+4
替换一些令牌并进行数学运算。
预处理器甚至不知道变量或对象或方法是什么。它纯粹根据预处理令牌(少量字符;有关详细信息,请参阅ISO C标准)进行操作。
答案 3 :(得分:2)
它按原样扩展:
-2+4*(-2+4*-2+4) = -2 +4(-6)= -26
使用()
将其固定在y周围#define CUBE(y) ((y)*(y)*(y))
所以你会得到:
((-2+4) * (-2+4) * (-2+4))