是的,所以我试图理解C预处理器和人类这是一个喧嚣.
我有一个简单的
#define Square(x)(x*x)
Run Code Online (Sandbox Code Playgroud)
我需要找出Square(5+2)在通话时会有什么回报.作为这个领域的新手,我立即想到它会显示出来49,但是看到它回来了17.在一些好的会议记录中,我试图找出这样的故事.
谁可以给我解释一下这个?因为我有点愚蠢,所以尽可能全面.
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)