我试图在这里理解此代码块:
#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
a
和b
被视为占位符字符串,并且当您调用mymult
时,参数a
和b
只是在编写时被复制。换一种说法: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)
这将产生相同的预期结果,因为
a
和b
将直接放入括号中。换一种说法: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/