14

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

考虑一个宏:

#define SQR(x) (x*x)

示例 1:

SQR(2) //prints 4

示例 2:

如果给定 SQR(1+1),它的总和不(1+1)等于2...

SQR(1+1) //prints 3

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

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

4

3 回答 3

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

于 2013-06-12T17:20:29.640 回答
6

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

于 2013-06-12T17:21:44.650 回答
6

这就是为什么你总是将宏的参数放入 (​​) 中:

#define SQR(x) ((x)*(x))
于 2013-06-12T17:23:09.067 回答