C 函数的 “普通调用”
如果一个函数仅仅是定义而没有被调用的话,则函数本身是不会执行的(认真琢磨这句话,非常重要)。我们都知道 C 代码是从 main() 函数 内部从上到下执行的,如果碰到函数调用部分,才会去执行函数定义部分。也就是说,函数定义之后只有被调用才有意义。
示例 1:求出两个数的最大值
#include <stdio.h>
int getMax(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int main(void)
{
printf("%d", getMax(10, 20));
return 0;
}运行结果如下。
20分析:
对于上面的 getMax() 函数,我们可以简写成下面代码。
int getMax(int a, int b)
{
return a > b ? a : b;
}示例 2:求一个数的绝对值
#include <stdio.h>
float getAbs(float n)
{
if (n >= 0)
{
return n;
}
else
{
return -n;
}
}
int main(void)
{
printf("%f", getAbs(-10.0));
return 0;
}运行结果如下。
10.000000分析:
对于上面的 getAbs() 函数,我们可以简写成下面代码。
float getAbs(float n)
{
return n >= 0 ? n : -n;
}C 函数的 “嵌套调用”
在 C 语言中,函数是不允许嵌套定义的,也就是在一个函数内部不能再定义一个新的函数。但是它却允许嵌套调用,即在一个函数中可以调用另一个函数。
示例 3:嵌套调用
#include <stdio.h>
// 求一个数的平方
int getSquare(int a)
{
return a * a;
}
// 求累加的和
int getSum(int n)
{
int result = 0;
for(int i = 1; i <= n; i++)
{
result += getSquare(i);
}
return result;
}
int main(void)
{
printf("%d", getSum(5));
return 0;
}运行结果如下。
55分析:
上面这个例子实现的功能是:计算 1^2 + 2^2 + ... + n^2的和。这里我们定义了 2 个函数,getSquare() 用于求一个数的平方,然后 getSum() 用于求累加的和。
在 getSum() 中,我们调用了 getSquare(),这种方式就是嵌套调用,也就是在一个函数内部调用另一个函数。聪明的小伙伴可能发现了,其实在主函数 main() 中去调用另一个函数,本质上也是嵌套调用的做法。说得一点都没错,确实是这样的。
示例 4:带返回值的嵌套调用
#include <stdio.h>
// 定义 square():返回一个整数的平方
int square(int n)
{
return n * n;
}
// 定义 addAndSquare():先将两个数相加,然后计算结果的平方
int addAndSquare(int a, int b)
{
int sum = a + b;
return square(sum); // 调用 square()
}
int main(void)
{
int result = addAndSquare(2, 3); // 调用 square()
printf("%d", result);
return 0;
}运行结果如下。
25分析:
在上面例子中,main() 函数调用了 addAndSquare() 函数。addAndSquare() 函数内部先计算了 a 和 b 的和,然后将这个和作为参数传递给 addAndSquare() 函数进行调用,最终返回平方值。从这个例子可以直观看出带返回值的函数是如何进行嵌套调用的,返回值会一级一级地传递回去。
