使用#define函数获取错误的值

时间:2014-11-17 20:23:07

标签: c++

有一种功能以两种不同的方式定义,一种使用#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;
}

3 个答案:

答案 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+hy-(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))替换,这是正确的