2015-04-02 3 views
1

Я пытаюсь понять этот блок кода здесь:Вызов по имени/Вызов по значению

#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. Я знаю, что «# определить это по существу работает через вызов по имени , а не называть по значению. Тем не менее, мне трудно понять, почему значение, которое оно возвращает, равно 11 ... а не 24. Что вызывает это?

+6

'# define' является подзадачей под названием bacisally, поэтому он преобразуется в' 2 + 2 * 3 + 3' – Predelnik

+0

@predlnik, который является ответом !! – Steephen

+0

... что является одной из многих причин, чтобы предпочесть встроенные функции над макросами. –

ответ

5

Вариант 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 следующим образом:

где 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;} 

Удачи!

+4

Или '#define mymult (a, b) (a) * (b) ' – LogicStuff

+2

Лучшее решение - изменить способ определения mymult. '#define mymult (a, b) (a) * (b)'. –

+0

@LogicStuff и @R Sahu: Если вам разрешено изменять макрос, то да, ваше предложение имеет больше смысла. Даже в конечном счете встроенная функция предпочтительнее макроса в этом конкретном случае. –