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

Dev*_*gur 2 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();
      }
Run Code Online (Sandbox Code Playgroud)

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

tro*_*dor 8

它确实:

j = -2 + 4 * (-2 + 4 * -2 + 4)
Run Code Online (Sandbox Code Playgroud)

CUBE的更正确定义是

#define CUBE(y) ((y)*(y)*(y))
Run Code Online (Sandbox Code Playgroud)


P0W*_*P0W 5

你应该通过使用-Eflag 来自己解决:

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();
      }
Run Code Online (Sandbox Code Playgroud)

要使用多维数据集编号,您应该使用它()来更改评估的优先级和顺序: -

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

使用-E标志后会给出:

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

  • 这是所有预处理者滥用者必须学习的有用技能! (2认同)