Получение неправильного значения с помощью функции #define

0

Существует одна функция, определенная двумя разными способами: одна С#define и другая с использованием функции. Но для вывода я получаю разные значения.

Выход будет 3 -1.

Я хочу знать, почему использование F(x,y) приводит к разным значениям.

#include<iostream>
#define F(x,y) y-x
using namespace std;

int F2(int x,int y)
{
    return y-x;
}

int main()
{
    int x=1,y=2, h=2;
    cout << F(x+h,y) << " " << F2(x+h,y) << endl;
    return 0;
}
  • 0
    Вероятно (некоторые пропущенные парены), обычная ошибка с макросами. Избегайте их за такие глупости.
  • 0
    И урок здесь ....?
Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

Классическая проблема с использованием #define и одна из основных причин, почему макросы не приветствуются. Имейте в виду, что макрос - это немного больше, чем буквальная замена, и рассмотрите, что он расширяет:

cout << y-x+h << " " << F2(x+h,y) << endl;

И y-x+h очень отличается от y-(x+h).

Всегда заключает в скобки использование макросов:

#define F(x,y) ((y)-(x))
  • 0
    Это действительно должно быть то, что @ EugeneSh. упоминает, что вы можете сделать (например) F(x+h,y) * 3 правильно.
  • 0
    @clcto Вы абсолютно правы, спасибо! Вот почему я избегаю макросов;)
3

Во-первых, вы не #define функцию, а макрос. Макросы выполняют прямую замену текста, поэтому выходная строка эквивалентна:

cout << y-x+h << " " << F2(x+h,y) << endl;

Вы можете заметить ошибку сейчас?

  • 0
    Чтобы добавить к ответу - это как раз та причина, по которой вы ВСЕГДА помещаете аргументы макроса (если вы действительно делаете это с ним) в скобках.
1

#define - это макрокоманда, а не функция. Он просто заменяет его появление макросом. Если вы это сделаете, вы увидите, что F(x+h,y) заменяется на y-x+h, что явно не то, что вы хотите. Правило для макросов состоит в том, чтобы взять все параметры и подвыражения в такие скобки:

#define F(x,y) ((y)-(x))

чтобы получить правильные результаты. Таким образом, F(x+h,y) будет заменено на ((y) - (x + h)), что верно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню