通过在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))