C++ 使用#define函数获取错误值
有一个函数以两种不同的方式定义,一种使用#define,另一种使用函数。但是对于输出,我得到了不同的值C++ 使用#define函数获取错误值,c++,C++,有一个函数以两种不同的方式定义,一种使用#define,另一种使用函数。但是对于输出,我得到了不同的值 #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,
#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-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;
}
#包括
#定义F(x,y)y-x
使用名称空间std;
整数F2(整数x,整数y)
{
返回y-x;
}
int main()
{
int x=1,y=2,h=2;
cout首先,您没有定义函数,而是定义宏。宏执行直接文本替换,因此输出行等效于:
cout << y-x+h << " " << F2(x+h,y) << endl;
cout首先,您没有定义函数,而是定义宏。宏直接替换文本,因此输出行等效于:
cout << y-x+h << " " << F2(x+h,y) << endl;
<代码> CUT> P>经典问题使用<代码> >定义< /C> >,以及为什么宏不被鼓励的主要原因之一。请记住,宏只不过是文字替换,并考虑它扩展到:
cout << y-x+h << " " << F2(x+h,y) << endl;
使用<代码> >的经典问题定义,也是宏不被鼓励的主要原因之一。请记住,宏只不过是文字替换,并考虑它扩展到:
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))替换,这是正确的#define
是一个宏指令,而不是函数。它只是用宏体替换它的引用。如果这样做,您将看到F(x+h,y)
替换为y-x+h
,这显然不是您想要的。宏的规则是将所有参数和子表达式放入括号中,如下所示:
#define F(x,y) ((y)-(x))
为了得到正确的结果。
通过这种方式,F(x+h,y)
将被((y)-(x+h))替换,这是正确的可能是(一些缺少的参数),这是宏的常见问题。避免像这样愚蠢的东西。这里的教训是……?与其使用#定义函数,最好使用内联函数,内联int F(int x,int y){返回y-x;}
您可能会得到更好的编译器诊断(例如,传入两个指针,可以在原始的#define宏中编译OK,但您可能并不真正想要),可能(缺少一些参数),这是一个常见的宏问题。避免使用这些愚蠢的东西。这里的教训是……?与其使用函数定义,最好使用内联函数,inline int F(int x,int y){return y-x;}
您可以获得更好的编译器诊断(比如说,传入两个指针,可以在原始的#define macro中编译OK,但您可能并不真正想要)添加到答案-这正是为什么您总是将宏参数(如果您确实使用宏参数)放在括号中的原因。添加到答案-这正是为什么您总是将宏参数放在括号中的原因(如果你真的用它做了某事)放在括号里。它真的应该是@sinets,这样你才能正确地做(例如)F(x+h,y)*3
。@clcto你完全正确,谢谢!看,这就是为什么我避免使用宏;)它真的应该是@sinets,这样你才能做(例如)F(x+h,y)*3
正确。@clcto你完全正确,谢谢!看,这就是我避免使用宏的原因;)