2012-06-01 2 views
1

Можно создать дубликат:
C Macros and use of arguments in parenthesesC Программирование Макросы умножения

Я нашел этот макрос вопрос будет очень интересно.

Если следующий код определяется как Macro

#define MULT(x, y) x * y 

И вызов функции производится в int z = MULT(3 + 2, 4 + 2);. Желаемый выход 3 + 2 = 5 и 4 + 2 = 6 И 5 * 6 - 30.

Но возвращаемый выход был 13. Он принимает это как 3 + 2 * 4 + 2. Следовательно, в соответствии с приоритетом операторов он сначала оценивает 2 * 4.

В чем причина? В случае меньших функций, подобных тем, которые эффективны? Определение функции или использование макросов?

+2

Столько дубликатов ... –

+0

Как вы измеряете эффективность? Время кодирования, время выполнения, ремонтопригодность ... –

+0

Макрос, вероятно, более эффективен. Если оптимизатор строит функцию, они, вероятно, будут эквивалентны. –

ответ

10

Попробуйте что-то вроде:

#define MULT(x, y) ((x)*(y)) 
+0

Спасибо. Но вопрос был больше обеспокоен эффективностью. – Katti

+0

@ Katti: как это никак связано с эффективностью? –

+0

Почему бы просто не использовать 'x * y' и пропустить макрос или функцию? – aztaroth

0

Попробуйте это:

#define MULT(x, y) ((x) * (y)) 

Лично я считаю, что это более удобным для чтения (и меньше нажатий клавиш), чтобы не использовать макрос. Это то, что кто-то начнет добавлять к своему коду в спешке изучения новых вещей и сожаления позже.

+1

Вам все еще не хватает скобок. Представьте себе 'z/MULT (x, y)' – Shahbaz

Смежные вопросы