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

时间:2013-06-12 17:19:11

标签: c++ c macros c-preprocessor

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

考虑一个宏:

#define SQR(x) (x*x)

示例1:

SQR(2) //prints 4

示例2:

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

SQR(1+1) //prints 3

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

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

3 个答案:

答案 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))