有一种功能以两种不同的方式定义,一种使用#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 :(得分:3)
首先,您没有#define
功能,而是宏。宏直接替换文本,因此输出行相当于:
cout << y-x+h << " " << F2(x+h,y) << endl;
你现在可以发现错误吗?
答案 1 :(得分:2)
使用#define
的经典问题,以及不鼓励使用宏的主要原因之一。请记住,宏只是一个字面替换,并考虑它扩展到:
cout << y-x+h << " " << F2(x+h,y) << endl;
y-x+h
与y-(x+h)
非常不同。
始终括号使用宏参数:
#define F(x,y) ((y)-(x))
答案 2 :(得分:1)
#define
是一个宏指令,而不是一个函数。它只是由宏体取代它的出现。如果您这样做,您会看到F(x+h,y)
被y-x+h
取代,这显然不是您想要的。宏的规则是将所有参数和子表达式都放入括号中,如下所示:
#define F(x,y) ((y)-(x))
以获得正确的结果。
这样F(x+h,y)
将被((y) - (x + h))替换,这是正确的