C++ #定义疑问…为什么会有这种行为
我已经定义了以下max宏C++ #定义疑问…为什么会有这种行为,c++,syntax,macros,C++,Syntax,Macros,我已经定义了以下max宏 #define max(a,b)(a>b?a:b); 在main()中,我正在执行以下操作 int t,a,b,c,d; t=max(a,b)+max(c,d); 但输出并不像预期的那样。t只显示a和b之间的最大值。 有什么问题吗?这就像写: t = (a>b?a:b);+(a>b?a:b); (检查预处理器输出) 删除来自定义。这将类似于编写: t = (a>b?a:b);+(a>b?a:b); (检查预处理器输出) 删除从定义
#define max(a,b)(a>b?a:b);
在main()中,我正在执行以下操作
int t,a,b,c,d;
t=max(a,b)+max(c,d);
但输出并不像预期的那样。t只显示a和b之间的最大值。
有什么问题吗?这就像写:
t = (a>b?a:b);+(a>b?a:b);
(检查预处理器输出)
删除
代码>来自定义。这将类似于编写:
t = (a>b?a:b);+(a>b?a:b);
(检查预处理器输出)
删除代码>从定义中删除。删除代码>。定义就是文本替换
您还应该将a
和b
放在括号中作为最佳做法。这一个通常不会起多大作用,因为比较运算符优先于您可能传入的任何内容,但可以这样说:
#define mul(a, b) (a * b)
然后你说mul(5-3,10+2)
,从这里你会期望输出是24(2*12),但是实际执行的是5-3*10+2
,使用操作顺序,这变成5-(3*10)+2
,所以你的答案会变成-23。如果它被定义为
#define mul(a, b) ((a) * (b))
您不会遇到此问题。删除代码>。定义就是文本替换
您还应该将a
和b
放在括号中作为最佳做法。这一个通常不会起多大作用,因为比较运算符优先于您可能传入的任何内容,但可以这样说:
#define mul(a, b) (a * b)
然后你说mul(5-3,10+2)
,从这里你会期望输出是24(2*12),但是实际执行的是5-3*10+2
,使用操作顺序,这变成5-(3*10)+2
,所以你的答案会变成-23。如果它被定义为
#define mul(a, b) ((a) * (b))
您不会有这个问题。您应该删除;在定义中。有关宏的更多信息:您还应该在宏体中围绕宏参数,以避免意外情况。您也不应该定义与标准库函数同名的宏;当有一个语言级的构造(比如内联函数)来做同样的工作,而不打开一扇通向许多奇怪错误的大门时,根本不需要定义宏;在定义中。有关宏的更多信息:您还应该在宏体中围绕宏参数,以避免意外情况。您也不应该定义与标准库函数同名的宏;如果有一个语言级的构造(比如内联函数)来完成相同的工作,而不会导致大量奇怪的错误,那么就不要定义宏。