按名称呼叫/按值呼叫

Tab*_*ock 1 c++ inline callbyname c-preprocessor 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";
}
Run Code Online (Sandbox Code Playgroud)

mymult = 11,mymult1 = 24.我知道'#define实际上是通过名字调用而不是按值调用.但是,我很难理解为什么它返回的值是11 ......而不是24.这是什么原因造成的?

ero*_*ras 5

选项1: 在以下情况下:

#define mymult(a, b) a*b
Run Code Online (Sandbox Code Playgroud)

ab像对待占位符字符串,当你调用mymult,参数ab被抄袭,因为他们写的.换一种说法:

mymult(2+2, 3+3) = 2+2*3+3
Run Code Online (Sandbox Code Playgroud)

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

因此,您可以致电mymult如下:

mymult( (2+2), (3+3) )
Run Code Online (Sandbox Code Playgroud)

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

这将被解释为:

mymult( (2+2), (3+3) ) = (2+2)*(3+3)    
Run Code Online (Sandbox Code Playgroud)

并返回24预期的值.

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

#define mymult(a, b) (a)*(b)
Run Code Online (Sandbox Code Playgroud)

这将给出相同的预期结果a,b并将直接放入括号中.换一种说法:

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

where a = 2+2, b = 3+3.
Run Code Online (Sandbox Code Playgroud)

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

inline int mymult(int a, int b) {return a*b;}
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • 或者`#define mymult(a,b)(a)*(b)` (4认同)
  • 更好的解决方法是改变`mymult`的定义方式.`#define mymult(a,b)(a)*(b)`. (2认同)