这个问题在模拟面试中被问到了......真的很惊讶地找到了尴尬的答案......
考虑一个宏:
#define SQR(x) (x*x)
示例1:
SQR(2) //prints 4
示例2:
如果给出SQR(1 + 1),它不会将(1+1)
与2
相加,而是......
SQR(1+1) //prints 3
尴尬吧?是什么原因?这段代码是如何工作的?
注意:我搜索了SO但找不到任何相关问题。如果有任何好评请分享!
答案 0 :(得分:47)
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(i++)
是一个宏,则SQR
将是未定义的行为,如果SQR
是一个函数则完全正确。
答案 1 :(得分:6)
问题是宏在编译之前正在进行文本替换,因此宏扩展为1+1*1+1
答案 2 :(得分:6)
这就是为什么总是将宏的参数放入():
#define SQR(x) ((x)*(x))