c语言函数由两部分组成_c语言编译执行还是解释执行

相信C语言初学者常会在前辈留下的项目,或者一些开源项目中看到以 void 作为参数的函数,例如 void fun(void),虽然我们都明白在C语言中,“void”表示空,但是按理说,如果函数不需要参数,直接空着就行:void fun(),为什么还要多此一举的写上 void 呢?

c语言函数由两部分组成_c语言编译执行还是解释执行

C语言函数参数的定义方式

大多数C语言教程在谈到自定义函数时,一般都将函数的“参数类型列表”放在“()”中,例如:

void f(int a, float b){ … }

C语言没有理由将“无参数函数”作为特例处理,因此从“通用性”来看,定义C语言函数时,“()”内应该始终有“参数类型列表”,如果函数不需要使用参数,应该指定为 void,而不是空着。

但是在C语言程序开发中,void fun(); 这种定义函数的方式又的确是可行的,难道C语言真的将“无参数函数”作为特例处理了吗?

c语言函数由两部分组成_c语言编译执行还是解释执行

其实不是的,在C语言中,定义函数时,指定参数还有另外一种方式(标识符列表方式):

void f(a, b) int a; float b; { … }

以标识符列表方式定义函数不常见,但的确是可用的,下面是一段完整的测试C语言代码,请看:

#include <stdio.h> void f(a, b) int a; float b; { printf(“%d, %f\n”, a, b); } int main() { f(); f(1); f(2, 3.14); return 0; }

c语言函数由两部分组成_c语言编译执行还是解释执行

编译并执行这段C语言代码,得到如下输出:

./a.out 1, 0.000000 1, -inf 2, 3.140000

可见,以“标识符列表方式”定义C语言函数,在调用时,函数的表现很像不定参数函数,未明确传递值的参数的值是未定义的。

另外,定义C语言函数时,标识符列表可以省去,但是参数类型列表不可以。因此,void fun(); 这种定义函数的方式其实是“标识符列表”被省去的一种特殊。

正如前面所讨论的,以“标识符列表方式”定义的C语言函数表现很像不定参数函数,因此 void fun(); 定义的函数,传递给其任意多的参数都是允许的:

void fun() {…} fun(); fun(1,3,4); //合法

而 void fun(void); 这种指定参数类型列表的定义方式就不同了,它限制了 fun() 函数不能接收任何参数:

void fun(void) {…} fun(); fun(1,2,3); //非法

c语言函数由两部分组成_c语言编译执行还是解释执行

标识符列表方式定义函数

现在我们已经知道,以参数类型列表方式定义C语言函数时,“()”内必须指定参数类型——如果不需要参数,需要指定其为 void。

因此,void fun(); 这种定义方式其实是以标识符列表方式定义的,只不过参数的类型和数目被省去了,因此调用者在调用 fun() 函数时,必须事先知道参数类型和数目。

如果传递给函数的参数是任意的(这对于以“标识符列表方式”定义的函数是允许的),那么就可能导致函数出现不预期的行为。例如函数的堆栈可能会被破坏,因为编译器并不限定传递的参数个数,函数在获得控制权后可能会出现不同的内存布局。

一般不推荐使用“标识符列表”方式定义C语言函数,这种方式在以前比较流行,如今有一些存在于许多历史遗留的代码中。

c语言函数由两部分组成_c语言编译执行还是解释执行

参数类型列表方式定义函数

以参数类型列表方式定义C语言函数是今天的主流,这种方式更加安全,因为它严格限定调用者传递给函数的参数类型和个数。例如 void fun(void); 函数在被调用时,只能以无参数方式调用 fun()。

另外,以参数类型列表方式定义的C语言函数,编译器能够准确知道参数的数据类型,因此函数可以对接收到的参数做隐式的类型转换,还可以对参数做一些类型提升(即所谓的默认参数提升),例如 char 类型提升为 int。

最后

顺便说一下,如果某个源文件中出现了省略的标识符列表方式定义的函数,和参数列表方式定义的函数,那么C语言原型将以参数列表方式定义的为准,请看下面这段C语言代码:

void f(); void f(int a) { … }

原因也是简单的,void f(); 定义的函数 f() 可以接收任意多的参数,而 void f(int a); 定义的函数 f() 只能接收一个 int 型的参数,编译器为了不违背二者,只好让函数 f() 只接受一个 int 型参数了。

c语言函数由两部分组成_c语言编译执行还是解释执行

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

未经许可,禁止转载。

本文【c语言函数由两部分组成_c语言编译执行还是解释执行】由作者: C/S结构 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4282.html

(0)
上一篇 2023-03-08 10:35:56
下一篇 2023-03-08 10:46:27

相关推荐

  • sql数据库开发是什么,sql数据库常用命令

    SQL 是一种非常常见但功能强大的工具,它可以帮助从任何数据库中提取、转换和加载数据。 数据查询的本质在于SQL。 随着公司和组织发现自己处理的数据量迅速增加,开发人员越来越需要有效地使用数据库来处理这些数据。 所以想要深入数据领域,SQL是必须的! 要掌握这门语言,你需要知道如何使用一些命令——其中大部分命令都基于一些基本命令。 对于整篇文章,我使用的是一…

    2023-03-15
    700
  • void指针作为函数参数

    我们知道,函数传址可以产生副作用,如一级指针做函数参数可以对一个普通变量产生副作用: int x = 0; void demo(&x);#include <stdio.h> #include <malloc.h> void demo(int* p); main() { int x = 0; demo(&x); prin…

    2023-03-09
    800
  • c语言从入门到精通第5版pdf,c语言程序设计第五版电子书

    C语言程序设计从入门到精通 10万读者认可的编程图书精粹 零基础自学编程的入门图书 详解C语言编程思想和核心技术

    2023-03-19
    000
  • 动态链接库dll初始化失败怎么弄

    首先在本机上安装了solid works软件,打开出现这样的情况,可以尝试重新启动在打开,还是没有效果的话不要慌张,这样的小问题是可以解决的! 不管是重启还是修复等一系列解决方法都没有解决的话,不妨试试我的解决方法吧! 不敢保证每个人都可以解决类似问题,但本人就是这样解决的 好了,不废话了,看下面的解决方法吧! 1:打开i控制面板上的电源选项 2:进入到选择…

    2023-03-09
    600
  • 智能指针初始化

    本节将实现一个名为SmartPointer的简化版本的shared_ptr模板类,相关C++代码如下。 知识产权协议 允许以教育/培训为目的向学生或受众进行免费引用,展示或者讲述,无须取得作者同意。 不允许以电子/纸质出版为目的进行摘抄或改编。 //Project – SmartPointer #include <iostream> using …

    2023-03-21
    000
  • windows正在启动后无信号 win7正在启动然后黑屏

    我们在使用电脑的过程中,难免会出现硬件或者系统、软件的故障,而近期有一个网友称自己的电脑出现了一个故障,那就是开机之后显示器黑屏无信号输入,但电脑主机一直在运行,其实出现了这个故障,原因众多,我们需要一一排查还可以解决问题,下面装机之家分享一下开机之后显示器黑屏无信号输入,但电脑主机一直在运行的解决方法。 据了解,该网友的显示器黑屏,并提示了无信号输入,显示…

    2023-03-20
    000
  • acceledent加速器

    近日,Zonff Partners宣布成立Web3创业加速器Aceleap,加速Web3早期创新生态发展。Aceleap首期将主要面向全球优秀的Web3华人创业者,Aceleap的核心优势是基于美元基金的筛选、孵化、赋能体系,以及Zonff Partners Eco的加密生态资源支持。 Aceleap将为创业者带来持续近5个月、总计近40个主题的线上线下同步…

    2023-03-20
    000
  • 看门狗程序是什么意思_看门狗程序是干什么

    学习嵌入式一定要对单片机有一个好的掌握,我们入门嵌入式刚开始也是以单片机开始,当然这也只是最基础的,如果想要更深一步了解嵌入式,这里小编给大家一个资料的共享加微信领取资料,接下来我们来了解一下单片机的看门狗攻能。 单片机的程序在运行过程中为了增加系统的可靠性,防止芯片受到外界干扰而程序跑飞等系统异常,于是我们就引入了看门狗的功能Watch Dog Timer…

    2023-03-18
    000
  • bs架构和springboot区别_bs开发框架

    目前我所在的项目组采用的是SpringBoot框架,前端使用BootStrap+jQuery。 SpringBoot是BS开发框架之一,不用单独开启tomcat服务器,目前比较流行,一般开发大型项目时会将所有的功能细分为许多小模块,每个模块都有dto、dao、service和controlleer层,有些模块还会加入validate层。 先给大家看个小模块的…

    2023-03-15
    200
  • 上位机与plc通信 上位机用什么软件与PLC通讯

    今天我给大家分享的内容是PLC,带大家简单认识一下PLC。主要从以下五个给大家简单介绍一下。 1、先给大家讲一下什么是控制系统以及控制器。 不论在工业领域,还是现实生活中,比如空调、加湿器、冰箱、电梯或是工厂用的各种设备,这些设备它们都存在一个控制系统的,我们正是通过这个控制系统才让设备按照我们的想法去完成相应的功能。 而这个控制系统的核心就是控制器,这个控…

    2023-03-20
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!