主题:[讨论]内置函数
clareying
[专家分:0] 发布于 2010-04-17 10:39:00
(1)#include <iostream>
using namespace std;
inline int max(int x,int y); //内置函数声明 《1》
int main()
{int a,b,c;
cout<<"please enter a,b:";
cin>>a>>b;
//inline int max(int x,int y); 《2》
c=max(a,b); //调用max函数
cout<<"max="<<c<<endl;
return 0;
}
inline int max(int x,int y) //内置函数
{ int z;
z=x>y?x:y;
return (z);
}
(2)
#include <iostream>
using namespace std;
int max(int x,int y); //函数声明 《1》
int main()
{int a,b,c;
cout<<"please enter a,b:";
cin>>a>>b;
//int max(int x,int y); //函数声明 《2》
c=max(a,b); //调用max函数
cout<<"max="<<c<<endl;
return 0;
}
int max(int x,int y)
{int z;
z=x>y?x:y;
return (z);
}
该两个程序 比较,
(1) 采用了内置函数, 则(1)中的内置函数声明只能放在《1》处,这是 为什么呢?
(2)没有用到内置函数,则(2)中的函数声明放在《1》《2》处都可以?
为什么会有这样的不同呢?
请高手指导,谢谢。
回复列表 (共4个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2010-04-17 12:01:00
在函数内声明为inline的结果将由编译器决定其结果,我在dev c++中的测试结果是在main内声明inline会被当成一次函数调用,自然就不能在定义之前这么写。去掉inline的话结果正确
板凳
clareying [专家分:0] 发布于 2010-04-17 14:06:00
“被当成一次函数调用” 不懂事什么意思?
3 楼
clareying [专家分:0] 发布于 2010-04-17 15:17:00
作者:雪光风剑
专家分:22120
会员信息
发短消息
所属博客
(1)
#include <iostream>
using namespace std;
template <typename T>
T max(T a,T b,T c)
{if(b>a) a=b;
if(c>a) a=c;
return a;
}
int main()
{
int i1=185,i2=-76,i3=567,i;
double d1=56.87,d2=90.23,d3=-3214.78,d;
long g1=67854,g2=-912456,g3=673456,g;
i=max(i1,i2,i3);
d=max(d1,d2,d3);
g=max(g1,g2,g3);
cout<<"i_max="<<max(i1, i2,i3)<<endl;
cout<<"d_max="<<d<<endl;
cout<<"g_max="<<g<<endl; //不可写成max(int a,int b,int c)
return 0;
}
(2)
#include <iostream>
using namespace std;
template <typename T>
int main()
{ T max(T a, T b,T c); //函数声明
int i1=185,i2=-76,i3=567,i;
double d1=56.87,d2=90.23,d3=-3214.78,d;
long g1=67854,g2=-912456,g3=673456,g;
i=max(i1,i2,i3);
d=max(d1,d2,d3);
g=max(g1,g2,g3);
cout<<"i_max="<<max(i1, i2,i3)<<endl;
cout<<"d_max="<<d<<endl;
cout<<"g_max="<<g<<endl; //不可写成max(int a,int b,int c)
return 0;
}
T max(T a,T b,T c)
{if(b>a) a=b;
if(c>a) a=c;
return a;
}
问:(1)不可以写成(2)? 即把max()函数放在了 main()函数之前,在main函数里对max进行了声明?
不行的原因是不是因为max在这里只是个函数模板,而非实质的函数。?
谢谢
4 楼
雪光风剑 [专家分:27190] 发布于 2010-04-17 21:42:00
模板一般不会分开去写声明和定义,因为有前置的模板声明template <typename T>需要作为模板的前提,否则T就是一个未被解析的符号。
第一个问题你可以去看一下dev c++的warning,说的是调用前未定义
我来回复