以sum作为参数的预处理器操作

Gin*_*uiu 0 c c-preprocessor

是的,所以我试图理解C预处理器和人类这是一个喧嚣.

我有一个简单的

#define Square(x)(x*x) 
Run Code Online (Sandbox Code Playgroud)

我需要找出Square(5+2)在通话时会有什么回报.作为这个领域的新手,我立即想到它会显示出来49,但是看到它回来了17.在一些好的会议记录中,我试图找出这样的故事.

谁可以给我解释一下这个?因为我有点愚蠢,所以尽可能全面.

dbu*_*ush 6

C中的预处理器宏执行直接符号替换.所以这:

Square(5+2)
Run Code Online (Sandbox Code Playgroud)

变成这样:

(5+2*5+2)
Run Code Online (Sandbox Code Playgroud)

虽然被评估为:

(5+(2*5)+2)
Run Code Online (Sandbox Code Playgroud)

这是17.

您应该始终括起宏参数以防止出现以下问题:

#define Square(x) ((x)*(x)) 
Run Code Online (Sandbox Code Playgroud)

然后上面的调用将扩展为:

((5+2)*(5+2))
Run Code Online (Sandbox Code Playgroud)