Существует одна функция, определенная двумя разными способами: одна С#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;
}
Классическая проблема с использованием #define
и одна из основных причин, почему макросы не приветствуются. Имейте в виду, что макрос - это немного больше, чем буквальная замена, и рассмотрите, что он расширяет:
cout << y-x+h << " " << F2(x+h,y) << endl;
И y-x+h
очень отличается от y-(x+h)
.
Всегда заключает в скобки использование макросов:
#define F(x,y) ((y)-(x))
F(x+h,y) * 3
правильно.
Во-первых, вы не #define
функцию, а макрос. Макросы выполняют прямую замену текста, поэтому выходная строка эквивалентна:
cout << y-x+h << " " << F2(x+h,y) << endl;
Вы можете заметить ошибку сейчас?
#define
- это макрокоманда, а не функция. Он просто заменяет его появление макросом. Если вы это сделаете, вы увидите, что F(x+h,y)
заменяется на y-x+h
, что явно не то, что вы хотите. Правило для макросов состоит в том, чтобы взять все параметры и подвыражения в такие скобки:
#define F(x,y) ((y)-(x))
чтобы получить правильные результаты. Таким образом, F(x+h,y)
будет заменено на ((y) - (x + h)), что верно