按名称致电/按值致电

塔布洛克

我试图在这里理解此代码块:

#include <iostream>
using namespace std;

#define mymult(a, b) a*b
inline int mymult1(int a, int b) {return a*b;}

int main() {
cout << "mymult(2+2, 3+3) = " << mymult(2+2, 3+3) << "\n";
cout << "mymult1(2+2, 3+3) = " << mymult1(2+2, 3+3) << "\n";
}

mymult = 11,而mymult1 =24。我知道'#define本质上是通过按名称调用而不是按值调用来工作的。但是,我很难理解为什么它返回的值是11 ...而不是24。是什么原因造成的?

埃罗尔·耶里亚拉斯

选项1

#define mymult(a, b) a*b

ab像占位符字符串一样对待,当您调用时mymult,参数ab会按照其编写时的方式进行复制。换一种说法:

mymult(2+2, 3+3) = 2+2*3+3

在哪里a = 2+2, b = 3+3

因此,您可以mymult按以下方式致电

mymult( (2+2), (3+3) )

在哪里a = (2+2), b = (3+3)

这将解释为:

mymult( (2+2), (3+3) ) = (2+2)*(3+3)    

并按24预期返回值

选项2:如果允许我们修改该#define语句,则另一种方法是用括号定义它,如下所示:

#define mymult(a, b) (a)*(b)

从此将产生相同的预期结果ab并将其直接放入括号中。换一种说法:

mymult(2+2, 3+3) = (2+2)*(3+3) = 24

where a = 2+2, b = 3+3.

选项3:坚持使用OP中定义的内联函数:

inline int mymult(int a, int b) {return a*b;}

祝你好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章