C语言函数调用基础应用详解

 更新时间:2023年02月11日 10:38:51   作者:Elanie1024  
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。这篇文章主要介绍了c语言是如何处理函数调用的?需要的朋友可以参考下

所谓函数调用(Function Call),就是使用已经定义好的函数。函数调用的一般形式为:

functionName(param1, param2, param3 ...);

functionName 是函数名称,param1, param2, param3 ...是实参列表。实参可以是常数、变量、表达式等,多个实参用逗号,分隔。

在C语言中,函数调用的方式有多种,例如:

//函数作为表达式中的一项出现在表达式中
z =max(x, y);
m = n +max(x, y);
//函数作为一个单独的语句
printf("%d", a);
scanf("%d",&b);
//函数作为调用另一个函数时的实参
printf("%d",max(x, y));
total(max(x, y),min(m, n));

函数的嵌套调用

函数不能嵌套定义,但可以嵌套调用,也就是在一个函数的定义或调用过程中允许出现对另外一个函数的调用。

【示例】计算sum = 1! + 2! + 3! + ... + (n-1)! + n!

分析:可以编写两个函数,一个用来计算阶乘,一个用来计算累加的和。

#include<stdio.h>
//求阶乘
longfactorial(int n){
int i;
long result=1;
for(i=1; i<=n; i++){
        result *= i;
}
return result;
}
// 求累加的和
longsum(long n){
int i;
long result =0;
for(i=1; i<=n; i++){
//在定义过程中出现嵌套调用
        result +=factorial(i);
}
return result;
}
intmain(){
printf("1!+2!+...+9!+10! = %ld\n",sum(10));//在调用过程中出现嵌套调用
return0;
}

运行结果:

1!+2!+...+9!+10! = 4037913

sum() 的定义中出现了对 factorial() 的调用,printf() 的调用过程中出现了对 sum() 的调用,而 printf() 又被 main() 调用,它们整体调用关系为:

main() --> printf() --> sum() --> factorial()

如果一个函数 A() 在定义或调用过程中出现了对另外一个函数 B() 的调用,那么我们就称 A() 为主调函数或主函数,称 B() 为被调函数。

当主调函数遇到被调函数时,主调函数会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回主调函数,主调函数根据刚才的状态继续往下执行。

一个C语言程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条。这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生命,从而结束整个程序。

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码,当遇到函数调用时,CPU 首先要记录下当前代码块中下一条代码的地址(假设地址为 0X1000),然后跳转到另外一个代码块,执行完毕后再回来继续执行 0X1000 处的代码。整个过程相当于 CPU 开了一个小差,暂时放下手中的工作去做点别的事情,做完了再继续刚才的工作。

从上面的分析可以推断出,在所有函数之外进行加减乘除运算、使用 if...else 语句、调用一个函数等都是没有意义的,这些代码位于整个函数调用链条之外,永远都不会被执行到。C语言也禁止出现这种情况,会报语法错误,请看下面的代码:

#include<stdio.h>
int a =10, b =20, c;
//错误:不能出现加减乘除运算
c = a + b;
//错误:不能出现对其他函数的调用
printf("csdn.net");
intmain(){
return0;
}

到此这篇关于C语言函数调用基础应用详解的文章就介绍到这了,更多相关C语言函数调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Opencv图像处理之图像增加边框

    Opencv图像处理之图像增加边框

    这篇文章主要为大家详细介绍了Opencv图像处理之图像增加边框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • C语言实现动态开辟存储杨辉三角

    C语言实现动态开辟存储杨辉三角

    这篇文章主要介绍了如何利用C语言实现动态开辟存储杨辉三角,可以灵活的开辟空间,充分的利用空间。文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2022-03-03
  • C语言实现哈夫曼编码

    C语言实现哈夫曼编码

    这篇文章主要为大家详细介绍了C语言实现哈夫曼编码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++内嵌汇编示例详解

    C++内嵌汇编示例详解

    这篇文章主要介绍了C++内嵌汇编,本文的所有代码是在我自己的VS2008中测试的,由于环境的差别,不能保证能在所有的编译器上运行,需要的朋友可以参考下
    2022-01-01
  • Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例

    Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开

    这篇文章主要介绍了Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例,需要的朋友可以参考下
    2020-03-03
  • C/C++细数宏与函数有那些区别

    C/C++细数宏与函数有那些区别

    在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度
    2022-10-10
  • C++继承中的访问控制实例分析

    C++继承中的访问控制实例分析

    这篇文章主要介绍了C++继承中的访问控制,是面向对象程序设计中非常重要的知识点,需要的朋友可以参考下
    2014-08-08
  • C++前缀树字典树的学习与模拟实现代码示例

    C++前缀树字典树的学习与模拟实现代码示例

    这篇文章主要介绍了C++前缀树字典树的学习与模拟实现代码示例,Trie又被称为前缀树、字典树,所以当然是一棵树,上面这棵Trie树包含的字符串集合是{in,inn,int,tea,ten,to},每个节点的编号是我们为了描述方便加上去的,需要的朋友可以参考下
    2023-07-07
  • C/C++编译报错printf was not declared in this scope问题及解决

    C/C++编译报错printf was not declared in 

    这篇文章主要介绍了C/C++编译报错printf was not declared in this scope问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言结构体嵌套与对齐超详细讲解

    C语言结构体嵌套与对齐超详细讲解

    这篇文章主要介绍了C语言结构体嵌套与对齐,C语言中结构体是一种构造类型,和数组、基本数据类型一样,可以定义指向该种类型的指针。结构体指针的定义类似其他基本数据类型的定义
    2022-12-12

最新评论