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码。因此在使用函数返回值的时候,需要留意这些隐含转换处理,虽然没有明确指出处理方法,但是编译器在编译的过程中会自动对其进行转换。