Звонок по имени / Звонок по значению

Я пытаюсь понять этот блок кода здесь:

#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

Решение

Опция 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;}

Удачи!

5

Другие решения