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

时间:2014-02-23 20:01:34

标签: c c-preprocessor

#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的工作原理。有人可以一步一步地描述这一点,意味着简单易行。

4 个答案:

答案 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))