c++ - 按名称调用/按值调用

标签 c++ inline c-preprocessor callbyname call-by-value

我试图在这里理解这段代码:

#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's 本质上是通过按名称调用而不是按值调用来工作的。但是,我无法理解为什么它返回的值是 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;}

祝你好运!

关于c++ - 按名称调用/按值调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29420470/

相关文章:

C++ 可变参数模板移除函数逻辑

C# 为什么使用实例方法作为委托(delegate)分配 GC0 临时对象但比缓存委托(delegate)快 10%

python - Django 管理后保存方法 - 怎么做?

c++ - 如何在结构内联中分配字符数组?

c# - 在 C# 中使用 pragma intrinsic(sqrt, pow)?

c++ - 如何在 C++ 中将 u32string 和 u16string 打印到控制台

c++ - 使用自定义类集时出错

c++ - 将所有代码放在 C++ 头文件中的优点和缺点?

c++ - 可视化标记条件编译

c++ - 使用 CPP 标志从一个源文件创建多个目标文件