C++ 我不知道';我不了解以下宏的工作原理

C++ 我不知道';我不了解以下宏的工作原理,c++,macros,C++,Macros,下列宏的数学等效方程是什么 #define SQ(a) (a*a ) int answer SQ(2 + 3 ); 对于这种情况,输出为11 以及 int answer SQ(2 + 4); 是14,我无法从输出中计算出方程式。您定义的宏缺少括号,无法使算术按您的要求运行。请记住,预处理器宏只执行文本替换。因此,您将从显示的调用中得到什么 int answer (2 + 4 * 2 + 4); 根据运算符优先级,结果为14 将宏编写为 #define SQ(a) ((a)*(a)) 以获

下列宏的数学等效方程是什么

#define SQ(a) (a*a )
int answer SQ(2 + 3 );
对于这种情况,输出为11 以及

int answer SQ(2 + 4);

是14,我无法从输出中计算出方程式。

您定义的宏缺少括号,无法使算术按您的要求运行。请记住,预处理器宏只执行文本替换。因此,您将从显示的调用中得到什么

int answer (2 + 4 * 2 + 4);
根据运算符优先级,结果为
14

将宏编写为

#define SQ(a) ((a)*(a))
以获得预期的结果。

SQ(2+4)扩展为2+4*2+4=14,因为宏中没有使用括号。对于新手来说,这是一个常见的宏陷阱,因为宏在这方面并不十分安全,因为它们只是作为原始字符串由预处理器处理

你应该这样写:

#define SQ(a) ((a)*(a))
这将扩展到:(2+4)*(2+4)=36

同样的逻辑也适用,如果用3替换4,则将得到11,并使用正确的宏25


也就是说,您真的不应该初始化这样的整数。一般的方法是使用显式赋值。

是什么阻止您自己测试它?您完全错误地理解了堆栈溢出是关于什么的。是的,输出是11,但我不知道它的工作原理。它扩展到
2+3*2+3
。这是非常琐碎的。谢谢你完全被这个家庭作业问题弄糊涂了。谢谢你提供更多的信息。不客气,但是请拿一本比亚恩写的书。