7.5 函数的调用方式及返回值
关于函数的调用类型,在此之前都已经接触过,但是并没有对其进行归类,接下来看函数的几种调用方式。
1.表达式的调用方式
对于函数在表达式中的调用,可以通过下面的一段代码来学习。
include<stdio.h>
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int a,b;
int abs;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入b的值:");
scanf("%d",&b);
abs=max(a,b)-min(a,b);
printf("输入的两数之差的绝对值为:%d\n",abs);
return 0;
}
运行结果:
请输入a的值:-9
请输入b的值:96
输入的两数之差的绝对值为:105
上面的函数调用采用的是通过函数表达式的方法。由于函数的返回值为整数,因此可以将其返回值视为一个整型数据,使其参与表达式的运算。在使用表达式方法调用函数的时候,需要注意函数的返回值,这时会将其函数作为一个返回值类型的变量来参与运算,当表达式执行函数的时候,函数会被调用,执行函数体。
2.参数的调用方式
除了通过函数表达式调用函数外,还可以通过函数参数的方法来调用函数,但是此时函数是作为函数的实参来调用的,看下面的代码。
include<stdio.h>
define N 10
char*str()
{
char*string="Hello World!";
return string;
}
int sum(int n)
{
int i;
int total;
total=0;
for(i=1;i<=n;i++)
total+=i;
return total;
}
int main()
{
printf("函数的返回值为字符串\n");
printf("%s\n",str());
printf("函数的返回值为整数\n");
printf("%d\n",sum(N));
return 0;
}
运行结果:
函数的返回值为字符串
Hello World!
函数的返回值为整数
55
在上面的代码中,通过把函数作为形参的方法来对函数进行调用,同样需要注意的是,在使用函数作为实参的时候,将函数作为一个返回值类型的变量来进行处理。从这里可以看出,函数的返回值决定了函数的调用方式。
3.函数语句的调用方式
如果函数的返回值为空,那么就不可以采用上面的两种方法对其进行调用,这时只能通过函数语句的方法来对其进行调用,如:
include<stdio.h>
define N 10
int factorial(int n)
{
int i;
int total;
total=1;
for(i=1;i<=n;i++)
total*=i;
return total;
}
void print(char*str)
{
printf("%s\n",str);
return;
}
int main()
{
factorial(N);
print("Hello World!");
return 0;
}
运行结果:
Hello World!
分析上面的运行结果可知,对函数的调用采用的是函数语句的调用方式。需要注意的是,对于那些返回值为非空的函数,虽然也可以采用这种方式,但是没有实际意义,所以一般不要对返回值为非空的函数采用这种方法。如果返回值为空,那么应该采用这种方法。
从以上三种方式的函数调用中发现,函数的返回值决定了函数调用方式。接下来分析函数的返回值,正如前面所讲解的,函数可以返回空值和非空值,对于返回值为空的函数,在此就不再讲解了,重点看看返回值为非空的函数,其返回类型可以是int、float、double等一般数据类型,也可以是指针、自定义结构体等复杂类型。
如果函数的返回类型和函数指定的返回类型不一致,会出现什么情况呢?看下面的代码。
include<stdio.h>
define N 10
double power(int a,int n)
{
int i;
int total;
total=1;
for(i=1;i<=n;i++)
total*=a;
return total;
}
char print()
{
int a;
a=0x12345865;
return a;
}
int main()
{
printf("%2.2lf\n",power(2,N));
printf("%c\n",print());
return 0;
}
运行结果:
1024.00
e
以上代码在power函数中,定义的函数返回类型是double类型,但是在函数体中,采用的却是返回int型的total,虽然得到的是正确的返回值,但是类型已经是double了,所以如果在函数体中返回的不是定义的函数返回类型,那么编译器在编译的时候将会对其进行强制转换处理。在下面的print函数中定义的返回类型是char型,但是在函数体中返回的却是int型。分析运行结果可知,编译器在编译的过程中对返回值进行了截取低字节的处理,定义的int型变量a的值为0x12345865,截取的低字节为0x65,转换为十进制是101,刚好是字符e的ASCII码。因此在使用函数返回值的时候,需要留意这些隐含转换处理,虽然没有明确指出处理方法,但是编译器在编译的过程中会自动对其进行转换。