Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用#define函数获取错误值_C++ - Fatal编程技术网

C++ 使用#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,

有一个函数以两种不同的方式定义,一种使用#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,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你完全正确,谢谢!看,这就是我避免使用宏的原因;)