1. 函数分类
首先要了解的是数学的函数性。
c++的函数定义描述了计算序列。有的函数具有返回值,有求值倾向,但函数本质上还是更强调过程性。在设计语言的时候,使用函数(function)这个词,套用了函数的原始意义——求值,但却与数学函数大不相同。它虽然说也是数学意义上的函数,但它是通过过程操作来实现求值的。
举个例子,就像是这个函数:
在c++中表示为:
double f(double x)
{
if(x < 0) return -1;
if(x = 0) return 0;
if(x >0 ) return 1;
}
这里用double类型表示返回值和参数。不过无论是double还是值域更广的longdoule都无法真实地表达R实数集。
数学函数f所描述的区间在C++函数中,用分支if语句来描述。f函数所对应的x=0,虽然我在代码中说if(x=0) return 0;但该句的前半句是完全可以省略的。在if以外涉及的数值区域,c++会默认else。
函数是可以没有参数的,比如,求随机数的函数int rand()没有参数,但可以获得非负的整数范围内的随机数。该函数源自于C库,在头文件stdlib.h中声明,也对应于c++中的cstdlib。该函数的作用是,取内部自身定义的素数加工成一个伪随机数作为函数值。
然后需要了解的是纯过程性:
另外的一些函数是没有“求值”表现的,其返回类型用void描述。调用的结果就是啥子都么得,仅用作传输的过程。
就像是:
void print()
{
cout<<"unsigned int f(unsigned int n){\n"
<<" if (n == 1 || n == 2) return 1; \n"
<<" return f(n-1) + f(n-2);\n"
<<"}\n";
}
这个过程就不需要参数,自然也就没有返回值。
但有一些表现为过程的函数会有参数表现,比如:
void delay(int n)
{
for(int i = 1; i <= n; ++i)
for(int j = 0; j<10000000; ++j)
}
就单纯的拖时间。
2. 语句抑或表达式
①值形式
有返回类型的函数构成值的形式,可以参加表达式运算,或者直接赋值给对应类型的变量,构成表达式语句。例如:
double s = sin(b) + 1; //变量s定义中用函数调用的表达式来初始化
s = cos(s)/2; //函数调用参加运算构成变量s的赋值
②语句形式
无返回值类型的函数,不能以值的形式赋给其他变量或者参加运算,其调用只能独立构成一条语句。例如:
print(); //正确
int t = print(); //错误
③ 混合形式
有需要的话,有返回类型的函数也可以像无返回类型的函数一样单独构成语句。例如:
char s1[30];
char s2[] ="hello";
strcpy(s1, s1); //单独成句,完成复制
cout<<strcpy(s1, s2); //值形式调用,复制且输出结果