通过在c 中平方宏SQR而感到困惑

这个问题在模拟面试中被问到了……真的很惊讶地找到了尴尬的答案……

考虑一个宏:

#define SQR(x) (x*x) 

例1:

 SQR(2) //prints 4 

例2:

如果给出SQR(1 + 1),它不会将(1+1)加到2而是……

 SQR(1+1) //prints 3 

尴尬吧? 是什么原因? 这段代码是如何工作的?

注意:我搜索了SO,但找不到任何相关问题。 如果有任何好评请分享!

SQR(1+1)扩展为1+1*1+1 ,这是3,而不是4,对吗?

宏的正确定义是

 #define SQR(x) ((x)*(x)) 

它扩展为(1+1)*(1+1)更重要的是 ,它向您展示了在不需要宏的情况下不应使用宏的原因之一。 以下是更好的:

 inline int SQR(int x) { return x*x; } 

此外:如果SQR是宏,则SQR(i++)将是未定义的行为 ,如果SQR是函数,则完全正确。

问题是宏在编译之前正在进行文本替换,因此宏扩展为1+1*1+1

这就是为什么你总是把参数放到宏中():

 #define SQR(x) ((x)*(x))