This question already has answers here:
The need for parentheses in macros in C [duplicate]
(8个答案)
Confusion with Macro expansion [duplicate]
(3个答案)
7年前关闭。
这个问题是在模拟面试中问我的...真的很惊讶地发现尴尬的答案...
考虑一个宏:
示例1:
示例2:
如果给出SQR(1 + 1),它不会将
尴尬吧?是什么原因?此代码如何工作?
注意:我搜索了SO,但是找不到任何相关问题。如果有任何帮助,请分享!
扩展为
此外:如果
(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