Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #定义疑问…为什么会有这种行为_C++_Syntax_Macros - Fatal编程技术网

C++ #定义疑问…为什么会有这种行为

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); (检查预处理器输出) 删除从定义

我已经定义了以下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);
(检查预处理器输出)


删除
从定义中删除。

删除
。定义就是文本替换

您还应该将
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))

您不会有这个问题。

您应该删除;在定义中。有关宏的更多信息:您还应该在宏体中围绕宏参数,以避免意外情况。您也不应该定义与标准库函数同名的宏;当有一个语言级的构造(比如内联函数)来做同样的工作,而不打开一扇通向许多奇怪错误的大门时,根本不需要定义宏;在定义中。有关宏的更多信息:您还应该在宏体中围绕宏参数,以避免意外情况。您也不应该定义与标准库函数同名的宏;如果有一个语言级的构造(比如内联函数)来完成相同的工作,而不会导致大量奇怪的错误,那么就不要定义宏。