This question already has answers here:
The need for parentheses in macros in C [duplicate]

(8个答案)



Confusion with Macro expansion [duplicate]

(3个答案)


7年前关闭。




这个问题是在模拟面试中问我的...真的很惊讶地发现尴尬的答案...

考虑一个宏:
#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)扩展为3,而不是4的1+1*1+1,对吗?

宏的正确定义是

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

扩展为(1+1)*(1+1),更重要的是 ,向您展示了您不应该在不需要宏的地方使用宏的原因之一。以下更好:
inline int SQR(int x)
{
    return x*x;
}

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

关于c++ - 在C中对宏SQR进行平方运算感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17071504/

10-15 02:01