预处理器如何在C中工作?

Arv*_*jam 7 c

为什么以下代码16的答案是什么?谁能解释一下这个程序的工作原理?

#define SQUARE(n) n*n
void main()
{
    int j;      
    j =16/SQUARE(2);

    printf("\n j=%d",j);
    getch();
}
Run Code Online (Sandbox Code Playgroud)

如果我们写下面的相同代码,那么答案是4:

//the ans is 4 why?
#include<stdio.h>
#include<conio.h>

#define SQUARE(n) n*n

void main()
{
    int j;      
    j =16/(SQUARE(2));

    printf("\n j=%d",j);
    getch();
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 16

预处理器只是替换文本,与写入完全相同.

因此,宏调用SQUARE(2)变得字面上2*2.

在你的情况下,这意味着整个表达式变为16/2*2,因为C的优先级规则评估为(16/2)*2,即16.

宏应始终括在括号中,并且每个参数都包含在内.

如果我们这样做,我们得到:

#define SQUARE(n)  ((n) * (n))
Run Code Online (Sandbox Code Playgroud)

替换为16/((2) * (2)),评估为16/4,即4.

围绕每个参数的括号使事情变得像SQUARE(1+1)按预期方式工作,没有他们打个电话,如16/SQUARE(1+1)将成为16/(1+1*1+1)16/3,即不是在所有你想要的东西.


Joh*_*ell 0

你会得到

j =16/2*2; // (16 / 2) * 2 = 16
Run Code Online (Sandbox Code Playgroud)