爱收集资源网

C语言编译器的三种标准和警告:你不能错过

网络整理 2023-10-01 02:05

目录(六)C语言编译器(主流)(七)什么是IDE(集成开发环境)?(八)什么是工程/项目?(九)哪款C语言编译器(IDE)适合初学者?(十)C语言的三套标准:C89、C99和C11(十一)C语言为何会有那么多编译器?(十二)程序在安装过程中都做了哪些?(十三)C语言程序的错误和警告(十四)分析第一个C语言程序

(一)从Hello,World开始

我们通常有两种形式从计算机上获取信息,一是看屏幕上的文字、图片、视频等,另一种是听扬声器发出的声音。让扬声器发出声音目前阶段还比较麻烦,我们先看怎么在屏幕上显示一些文字吧。

在屏幕上显示逾矩十分简单,只须要一个句子,例如,下面的代码会让屏幕上显示“Hello,World”。

puts(“Hello,World”);

这里有一个生疏词汇“puts”,用来让计算机在屏幕上显示文字。

更加专业的爱称:

“puts”是output string的简写,意思是“输出字符串”。

在C语言中,字符串通常须要用""包围上去,Hello,World哪些也不是,计算机并不认识他,"Hello,World"才是字符串。

puts在输出字符串的时侯,需要将字符串置于()内

在汉语和日语中,一般用“。”和“.”表示一句话的结束,而在C语言中,使用“;”表示一个句子的结束。

puts(“Hello,World”)表达了完整的意思,是一个完整的句子,需要在最后加上“;”,表示当前句子结束了。

总结上去,上面的句子可以分为三部份:

(二)第一个C语言程序, C语言的整体框架

puts可以在显示器上输出内容,但是仅有puts是不够的,程序不能运行,还要添加其他代码,构成一个完整框架,完整框架如下:

#8:a:2:4:6:c:9:4:8:d:b:8:c:6:e:d:a:6:f:e:2:b:d:2:a:7:6:6:6:a:b:9#

第1~3行、第5~6行是固定的,所有C语言都必须有这几行,暂时不需要了解是哪些意思,之后我们渐渐讲解。

先记住,今后我们写的所有类似puts这样的句子,都必须置于{ }之间才有效。

另外,颜色是为了分辨不同的语义,这个我们前面会渐渐了解到。

(三)输入法的选择(中/英),全角全角的区别

计算机起源于日本,C语言、C++、Java、JavaScript等好多流行的编程语言都是日本人发明的,所以在编撰代码的时侯必须使用英语全角输入法,尤其是标点符号。一定要注意。

例如,上文我们使用puts句子在显示器上显示的内容:

puts(“Hello,World”);

这里的括弧、双引号、分号都必须是英语符号,而且是全角的。

全角和全角的区别在于不仅汉字以外的其他字符,比如标点符号、英文字母、阿拉伯数字等,全角和全角字符所占用的位置大小不同。在计算机屏幕上,一个汉字要占两个英语字符的位置,人们把一个英语字符所占的位置称为“半角”,相对的把一个汉字所占的位置称为“全角”。

标点符号、英文字母、阿拉伯数字那些字符不同于汉字,在全角状态下她们被当成中文字符处理,在半角状态下被作为英文字符处理,请看下边的事例:

半角输入:

Hello C,I like!

全角输入:

HelloC,Ilike!

另外,很重要的是,相同的字符在全角和半角的状态下对应的编码值(如Unicode编码,GBK编码等)不一样,所以她们是不同字符

(四)什么是源文件?

在软件开发的过程中,我们须要将我们编撰的代码(Code)保存到一个文件中,这样代码才不会遗失,才能够被编译器(后文解释)找到,才能最终弄成可执行文件。这种拿来保存代码的文件就叫源文件(Source File)

源文件或许就是纯文本文件,他的内部并没有特殊的格式。但是每种编程语言的源文件都有特定的后缀,以便捷被编译器辨识,被程序员理解。源文件的后缀大多按照编程语言本身的名子来命名,比如:

另外,C++是在C语言的基础上发展上去的,是C语言的扩充,C++也包含了C语言的全部内容,将C语言置于.cpp文件中不会有错,但是我还是强烈建议把C语言代码置于.c文件中,这样能愈发严谨的遵守C语言的句型,也才能愈发清晰的了解C语言和C++的区别。

(五)C语言的编译和链接

我们平常所说的程序就是指双击后才能直接运行的程序,这样的程序称为可执行程序(Executable Program)。在WIndows下,可执行程序的后缀有.exe或.com(其中.exe比较常见);在类UNIX系统(Linux,Mac OS等)下,可执行程序没有特定后缀,系统按照头文件信息来判定是否是可执行程序。

可执行程序的内部是一系列计算机指令和数据的集合,他们都是二进制方式的,CPU可以直接辨识,毫无障碍。但是对于程序员,他们十分冗长,难以记忆和使用。

例如在屏幕上输出“Hello world”,C语言的写法为

puts(“Hello world”);

二进制的写法为

#8:c:b:6:6:9:8:8:e:9:0:5:7:b:d:2:2:5:0:0:d:5:0:7:6:4:c:f:e:f:6:1#

感受一下这个复杂的写法。

在计算机发展早期,程序员就是这样使用二进制的命令来编撰程序的,那个年代还没有编程语言。

直接使用二进制指令编程对程序员来说简直是恶梦,尤其当程序比较大的时侯,不断编撰麻烦,还要频繁的查询指南,出错也异常难处理,因为要面对一堆二进制数据。另外,二进制指令编程步骤繁杂,要考虑各类边界情况和底层问题,开发效率非常低下。

这就促使程序员开发出了编程语言,提高自己的生产力。例如汇编、C语言、C++、Java、Python、Go语言等。

编译(Compile)

C语言的代码由固定的词汇依照固定的格式组织上去,简单直观,程序员容易理解,但是对于CPU,C语言代码简直就是天书,根本不认识,CPU只认识几百个二进制指令。这就须要一个工具,将C语言的代码转换成CPU才能辨识的二进制指令,也就是将代码加工成.exe程序的格式。这个工具是一个特殊的软件,叫做编译器(Compiler)。

编译器还能辨识代码中的词汇、句子以及特定的格式,并将她们转换成计算机就能辨识的二进制方式,这个过程称编译(Compile)。

编译也可以理解为翻译,类似于将英文翻译成英文,他是一个复杂的过程,大致包括词法分析、语法剖析、语义剖析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件结构,有兴趣的自行阅读《编译原理》。

不了解编译原理不影响我们学习C语言,我也不建议初学者去钻研编译原理,不要把自己绕进去。

C语言的编译器有很多种,不同平台下有不同的编译器:

你的代码正确与否,编译器说了才算,我们学习C语言,从某种意义上是学习怎么使用编译器。

编译器可以100%保证你的代码从句型上是正确的,哪怕有一点小小的错误,编译也不能通过,编译器也会告诉你那里错了,方便你更改。

链接(Link)

C语言代码经过编译后,并没有生成最终的可执行文件,而是生成了一种称作**目标文件(Object File)**的中间文件(或者说临时文件),目标文件也是二进制方式的,他和可执行文件是一致的。对于Visual C++,目标文件的后缀是.obj;对于GCC,目标文件的后缀是.o。

目标文件经过链接(Link)后才会弄成可执行文件。既然目标文件和可执行文件的格式是一样的,为什么还要再链接一次呢,直接作为可执行文件不行吗?

不行的!因为编译只是把我们自己写的代码弄成了二进制方式,他还须要和系统组件(比如标准库、动态链接库)结合上去,这些组件都是程序运行所必须的。

链接(Link)其实就是一个“打包”的过程,他将所有二进制方式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也须要一个特殊的软件,叫链接器(Linker)。

随着我们代码越写越多,最终须要将她们分散在多个源文件中。编译器每次只能编译一个源文件,生成一个目标文件,这个时侯,链接器不仅将目标文件和系统组件结合上去,还须要将编译器生成的多个目标文件组合上去。

再次指出,编译是针对一个源文件的,有多少个源文件才会编译多少次,就会生成多少个目标文件。

总结

不管我们编撰的代码有多简单,都必须经过【编译–>链接】的过程能够生成可执行文件

另外,如果不是非常指出,一般情况下我们所说的编译器也包含了链接器。

(六)C语言编译器(主流)

由于C语言历史悠久,早起规范也相对较少,计算机产业也处于拓荒的时代,所以涌现了好多C语言编译器,他们各有特征,适用于不同平台,下面我们将介绍一下

桌面操作系统

对于当前主流桌面操作系统而言,可使用 Visual C++、GCC 以及 LLVM Clang 这三大编译器。

Visual C++(简称 MSVC)是由谷歌开发的,只能用于 Windows 操作系统;GCC 和 LLVM Clang 除了可用于 Windows 操作系统之外,主要用于 Unix/Linux 操作系统。

像现今好多版本的 Linux 都默认使用 GCC 作为C语言编译器,而像 FreeBSD、macOS 等系统默认使用 LLVM Clang 编译器。由于当前 LLVM 项目主要在 Apple 的主推下发展的,所以在 macOS中,Clang 编译器又被称为 Apple LLVM 编译器。

MSVC 编译器主要用于 Windows 操作系统平台下的应用程序开发,它不开源。用户可以使用 Visual Studio Community 版原本免费使用它,但是假如要把通过 Visual Studio Community 工具生成下来的应用进行商用,那么就得好好阅读一下谷歌的许可证和说明书了。

而使用 GCC 与 Clang 编译器建立下来的应用通常没有任何限制,程序员可以将应用程序随便发布和进行商用。

MSVC 编译器对 C99 标准的支持就非常有限,加之它压根不支持任何 C11 标准,所以本教程中设计 C11 的代码反例不会针对 MSVC 进行描述。所幸的是,Visual Studio Community 2017 加入了对 Clang 编译器的支持,官方称之为——Clang with Microsoft CodeGen,当前版本基于的是 Clang 3.8。

也就是说,应用于 Visual Studio 集成开发环境中的 Clang 编译器后端可支持 Clang 编译器的所有句型特点,而前端生成的代码则与 MSVC 效果一样,包括像 long 整数类型在 64 位编译模式下宽度依然为 4 个字节,所以诸位使用的时侯也须要注意。

为了便捷描述,本教程前面涉及 Visual Studio 集成开发环境下的 Clang 编译器简称为 VS-Clang 编译器。

嵌入式系统(作为了解)

而在嵌入式系统方面,可用的C语言编译器就十分丰富了,比如:

通常,用于嵌入式系统开发的编译工具链都没有免费版本,而且通常须要通过国外代理进行订购。所以,这对于个人开发者或则嵌入式系统爱好者而言是一道不低的门槛。

不过 Arduino 的开发套件是可免费下载使用的,并且用它做开发板联接调试也非常简单。Arduino 所采用的C编译器是基于 GCC 的。

还有像树莓派(Raspberry Pi)这种迷你电脑可以直接使用 GCC 和 Clang 编译器。此外,还有像 nVidia 公司推出的 Jetson TK 系列开发板也可直接使用 GCC 和 Clang 编译器。树莓派与 Jetson TK 都默认安装了 Linux 操作系统。

在嵌入式领域,一般比较高端的单片机,比如 8 位的 MCU 所对应的C编译器可能只支持 C90 标准,有些甚至连 C90 标准的好多特点都不支持。因为它们一方面显存小,ROM 的容量也小;另一方面,本身处理器机能就非常有限,有些甚至难以支持函数指针,因为处理器本身不包含通过寄存器做间接过程调用的指令。

而像 32 位处理器或 DSP,一般都起码能支持 C99 标准,它们本身的性能也非常强悍。而像 ARM 出的 RVDS 编译器甚至可用 GNU 语法扩充。

下图展示了上述C语言编译器的分类。

#1:7:9:0:5:1:e:0:2:0:9:2:5:b:e:c:2:1:4:a:b:7:3:9:5:b:f:8:b:a:b:1#

(七)什么是IDE(集成开发环境)?

实际开发中,除了编译器是必备的工具,我们常常还须要好多其他辅助软件,例如:

这些工具一般被打包到一起,统一发布和安装,例如Visual Studio、Dev C++、Xcode、Jetbrains Clion等,他们也称为集成开发环境(IDE,Integrated Development Environment)

IDE就是一系列开发工具的组合套装。这就好比台式机,一个台式机的核心部件是主机,有了主机能够独立工作了,但是在我们订购台式机时,往往还要附送上显示器、键盘、鼠标等外围设备,因为只有主机太不方便了,必须有外设能够玩的爽。

(八)什么是工程/项目?

在实际开发中,程序员会将代码分门别类的置于多个源文件中。除了那些代码源文件,一个程序常常还须要包含图片、视频、音频、控件、库等其他资源,他们也都是一个个的文件。

为了有效管理这种文件,我们有理由把她们都放在同一个目录(文件夹)下,并且这个目录下只储存当前程序有关的资源。实际上,IDE也是如此做的,他会为每位程序都创建一个专门的目录,将所有用到的文件都集中到这个目录下,并对她们进行方便的管理,比如重命名、删除、编辑等。

这个为当前程序专用的文件夹,在IDE中有个专门的尊称,叫做“Project”,翻译过来就是工程或则项目。在Visual C++6.0下,这称作一个“工程”,而在Visual Studio下,这又称作一个“项目”。只是词组“Project”翻译不同而已,其实是一个道理。

工程类型/项目类型

程序是一个比较笼统的尊称,他可以细分为好多类,比如:

不同的程序对应不同的工程类型(项目类型),使用 IDE 时必须选择正确的工程类型能够创建出我们想要的程序。换句话说,IDE 包含了多种工程类型,不同的工程类型会创建出不同的程序。

不同的工程类型本质上是IDE中各个参数的不同设置。

(九)哪款C语言编译器(IDE)适合初学者?

C语言有这么多的编译器,尤其是Windows下,多如牛毛,本节我们将针对Windows、Linux、Mac OS三大平台进行讲解。

Windows下推荐的IDE

Windows 下首先推荐你们使用谷歌开发的 Visual Studio(简称 VS),它是 Windows 下的标准 IDE,实际开发中你们也都在使用。

为了适应最新的 Windows 操作系统,微软每隔一段时间(一般是一两年)就会对 VS 进行升级。VS 的不同版本以发布年份命名,例如 VS2010 是谷歌于 2010 年发布的,VS2017 是谷歌于 2017 年发布的。

对于初学者,我推荐使用 VS2015。最好不用使用 VS2017,有点坑初学者。

现在VS稳定版早已更新到2019了,也比较推荐使用。

大家去官网自行下载即可

Linux下推荐的IDE

Linux 下可以不使用 IDE,只使用 GCC 编译器和一个文本编辑器(例如 Gedit)即可,这样对初学者理解C语言程序的生成过程十分有帮助

当然,如果你希望使用 IDE,那么可以选择 CodeLite、Code::Blocks、Anjuta、Eclipse、NetBeans 等。

Mac OS下推荐的IDE

Mac OS 下推荐使用 Apple 官方开发的 Xcode,在 APP Store 即可下载

另外,Visual Studio 也推出了 Mac 版本,已经习惯了 Visual Studio 的用户可以高兴一把了。

另外推荐

另外,jetbrains家的软件也很不错,针对目前几乎所有编程语言,都有着比较好的支持。

(十)C语言的三套标准:C89、C99和C11

今天我们所使用的Windows、Linux、Mac OS等操作系统都是由一种称作Unix的系统演变而至。Unix作为80年代的主流操作系统,是整个软件工业的基础,是现代操作系统的鼻祖,C语言就是为Unix而生的。

Unix和C语言的开发者都是同一人,名字叫丹尼斯·里奇(Dennis MacAlistair Ritchie)

2011年10月12日(北京时间为10月13日),丹尼斯·里奇逝世,享年70岁。

C语言的诞生

1967年,26岁的丹尼斯·里奇步入贝尔实验室开发 Unix,并于 1969 年圣诞节前推出第一个试运行版本。这个时侯的 Unix 是用汇编语言写的,移植性十分差,要想让 Unix 运行在不同机型的机器上,就得针对每位机型的机器重画一遍操作系统,这也许是一个不可能完成的任务。

为了提升通用性和开发效率,丹尼斯·里奇决定发明一种新的编程语言——C语言。紧接着,丹尼斯·里奇就用C语言改写了 Unix 上的C语言编译器,他的朋友汤姆森则使用C语言重画了 Unix,使它成为一种通用性强、移植简单的操作系统,从此开创了计算机编程史上的新篇章,C语言也成为了操作系统专用语言。

C89(C90)标准

到了80年代,C语言越来越流行,广泛被业界使用,从小型主机到大型微机,各个厂商群雄并起,推出了多款C语言的编译器。这些编译器按照行业和厂商自己的需求,进行了各类扩充,C语言步入了春秋战国时代,逐渐演弄成一个松散零乱的大家族。

为统一C语言版本,1983 年美国国家标准局(American National Standards Institute,简称 ANSI)成立了一个委员会,专门来制订C语言标准。1989 年C语言标准被批准,被称为 ANSI X3.159-1989 “Programming Language C”。这个版本的C语言标准一般被称为 ANSI C。又因为这个版本是 89 年完成制订的,因此也被称为 C89。

后来 ANSI 把这个标准递交到 ISO(国际化标准组织),1990 年被 ISO 采纳为国际标准,称为 ISO C。又由于这个版本是1990年发布的,因此也被称为 C90。

ANSI C(C89)与 ISO C(C90)内容基本相同,主要是格式组织不一样。

因为 ANSI 与 ISO 的C标准内容基本相同,所以对于C标准,可以称为 ANSI C,也可以说是 ISO C,或者 ANSI / ISO C。以后你们看见 ANSI C、ISO C、C89、C90,要知道这种标准的内容都是一样的。

目前常用的编译器,例如谷歌编译器、GCC、LLVM/Clang 等,都能挺好地支持 ANSI C 的内容。

C99标准

在 ANSI C 标准确立以后,C语言的规范在很长一段时间内都没有大的变动。1995 年C程序设计语言工作组对C语言进行了一些更改,增加了新的关键字,编写了新的库,取消了原有的限制,并于 1999 年产生新的标准——ISO/IEC 9899:1999 标准,通常被成为 C99。

但是这个时侯的C语言编译器基本已然成熟,各个组织对 C99 的支持所表现下来的兴趣不同。当 GCC 和其它一些商业编译器支持 C99 的大部分特点的時候,微软和 Borland 却好像对此不感兴趣,或者说没有足够的资源和动力来改进编译器,最终造成不同的编译器在部份句型上存在差别。

例如,ANSI C 规定,局部变量要在函数开头定义,而 C99 取消了这个限制,变量可以在任意位置定义,后续说到变量时再详尽介绍。

C11标准

C11 标准由国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会于 2011 年底即将发布,支持此标准的主流C语言编译器有 GCC、LLVM/Clang、Intel C++ Compile 等。

C11 标准主要降低了以下内容:

总结

现有的教程(包括书籍、视频、大学课程等)大都是针对 C89 编写的,这是C语言的核心,后来的 C99、C11 新增的特点并不多,只是在“打补丁”。在这博客中的一系列篇章中的内容即使基于 C99 标准,但是绝大部分内容还是 C89 的,我会在 C89 和 C99 有差别的句型上给出重点说明。

(十一)C语言为何会有那么多编译器?

通过上文C语言的标准中介绍可以晓得,C语言没有一个官方的机构,也不属于那个公司,他只有一个制订标准的委员会,任何其他组织或则个人都可以开发C语言的编译器,而这个编译器要遵循那个C语言标准,是 100% 遵守还是部份违背,并没有强制性的举措,也没有任何约束。

换句话说,各个厂商可以为了自己的利益、根据自己的喜好来开发编译器。

这就造成了一个棘手的问题,有的编译器遵循较新的C语言标准,有的编译器只能遵循较老的C语言标准,有的编译器还进行了好多扩充。比如:

初学者常常会碰到这些情况,有些代码在谷歌编译器下才能正常运行,拿到 GCC 下就不行了,一堆报错信息;或者反过来,在 GCC 上能运行的代码在谷歌编译器下不能运行。这是因为不同的编译器支持不同的标准,并且每位编译器都进行了自己的扩充,假如你使用了谷歌编译器私有的扩充函数,那么领到 GCC 下肯定是不支持的。

(十二)程序在安装过程中都做了哪些?

我们晓得,大部分软件都须要先安装能够使用,例如 QQ、360、迅雷等,要先从网上下载一个安装包,然后安装到计算机的磁盘或则盘符等。大部分程序都会在开始菜单或则桌面上生成一个快捷方法,用户只要点击快捷方法,就可以启动软件。

那么,一个程序为何要安装呢?下载后直接使用不可以吗?下面我们就来剖析一下。

不同的操作系统,安装软件的方式其实不一样,但基本原理是相同的,主要的思想就是将程序的二进制可执行文件拷贝到某个目录,设置一些路径。如果程序运行时须要一些库,将这种库拷贝到系统目录即可。

程序的安装基本上要经过下边四个步骤:

将程序的可执行文件从安装包所在的位置,拷贝到要安装的目录。

安装程序的时侯,程序会给用户指定一个默认的安装目录,如果用户须要,也可以自定义安装,改变安装目录。一般所谓的“绿色软件”到此就安装结束了,可以使用了。

如果有必要,可以向系统目录拷贝一些动态链接库(DLL)。(可选操作)

有的程序,比如小型游戏,可能须要好多动态链接库(DLL)的支持,这时候程序可能会将这种 DLL 拷贝到系统库的默认目录,Win7 下通常拷贝到C:\Windows\System32\(读者不妨打开该目录,会看见好多 DLL 文件)。

有些程序用到的 DLL 文件不是系统必需的,只能由程序自己使用,这样置于系统目录里就不太合适,安装的软件多了,就会导致系统臃肿,所以这种 DLL 会被拷贝到程序的安装目录。

向系统注册表中写入相应的设置项,注册程序或则库的安装信息。(可选操作)

安装前,用户可能会对软件做一些设置,安装时,这些设置都会被写入注册表。另外,当安装程序将 DLL 文件拷贝到系统目录时,一些 DLL 还须要向系统注册,告诉系统我在这儿,不然使用的时侯可能会找不到。

在开始菜单或则桌面上位程序创建快捷方法。(可选操作)

创建快捷方法主要是为了用户使用便捷,有了快捷方法,就不用再到安装目录去启动程序了。

由此可见,程序在安装前后并没有哪些区别,只不过是进行了一些设置,有的设置是程序运行所必须的,有的是为了让用户愈加便捷。

(十三)C语言程序的错误和警告

一般C语言代码,在编译、链接和运行各个阶段都可能会出现问题。编译器只能检测编译和链接阶段出现的问题,而可执行程序早已脱离了编译器,运行阶段程序出现问题编译器是无能无力的。

如果我们编撰正确,运行时会提示没有错误和警告。

**错误(Error)**表示程序不正确,不能正常编译、链接和运行,必须要纠正。

**警告(Warning)**表示可能发生错误(实际上未发生)或者代码不规范,但是程序能正常运行。有些警告可以忽视,有的要引起注意。

我们写的代码肯定会发生错误,一定要有剖析错误的能力,这是一个合格的程序员必备的技能。

(十四)分析第一个C语言程序

注:本节涉及的好多概念后续会详尽讲解,但还是希望读者多看几遍,做一个了解,有个概念。

我们以之前的一个完整代码为例:

#8:a:2:4:6:c:9:4:8:d:b:8:c:6:e:d:a:6:f:e:2:b:d:2:a:7:6:6:6:a:b:9#

函数的概念

先来看第 4 行代码,这行代码会在显示器上输出“C语言中文网”。前面我们早已讲过,puts 后面要带( ),字符串也要置于( )中。

在C语言中,有的句子使用时不能带括弧,有的句子必须带括弧。带括弧的称为函数(Function)。

C语言提供了好多功能,例如输入输出、获得日期时间、文件操作等,我们只须要一句简单的代码能够够使用。但是这种功能的底层都比较复杂,通常是软件和硬件的结合,还要要考虑好多细节和边界,如果将这种功能都交给程序员去完成,那将极大降低程序员的学习成本,降低编程效率。

好在C语言的开发者们为我们做了一件好事,他们早已编撰了大量代码,将常见的基本功能都完成了,我们可以直接用来使用。但是如今问题来了,那么多代码,如何从中找到自己须要的呢?一股脑将所有代码都用来其实是十分不明智的。

这些代码,早已被分门别类地置于了不同的文件中,并且每一段代码都有惟一的名子。使用代码时,只要在对应的名子前面加上( )就可以。这样的一段代码才能独立地完成某个功能,一次编撰完成后可以重复使用,被称为函数(Function)。读者可以觉得,函数就是一段可以重复使用的代码。

函数的一个显著特点就是使用时必须带括弧( ),必要的话,括号中还可以包含待处理的数据。例如puts(“C语言中文网”)就使用了一段具有输出功能的代码,这段代码的名子是 puts,“C语言中文网” 是要交给这段代码处理的数据。使用函数在编程中有专业的尊称,叫做函数调用(Function Call)。

如果函数须要处理多个数据,那么它们之间使用冒号,分隔,例如:

pow(10, 2);

该函数拿来求10的2次方。

需要注意的是,C语言中的函数和物理中的函数不是同一个概念,不要拿二者对比。函数的英语名称是 Function,它还有“功能”的意思。大陆将 Function 翻译为“函数”,而台湾地区翻译为“函式”,读者要注意分辨。

自定义函数和main函数

C语言自带的函数称为库函数(Library Function)。库(Library)是编程中的一个基本概念,可以简单地觉得它是一些列函数的集合,在c盘上常常是一个文件夹。C语言自带的库称为标准库(Standard Library),其他公司或个人开发的库称为第三方库(Third-Party Library)。

除了库函数,我们还可以编撰自己的函数,拓展程序的功能。自己编撰的函数称为自定义函数。自定义函数和库函数在编撰和使用方法上完全相同,只是由不同的机构来编撰。

示例中第2~6行代码就是我们自己编撰的一个函数。main 是函数的名子,( ) 表明这是函数定义,{ } 之间的代码是函数要实现的功能。

函数可以接收待处理的数据,同样可以将处理结果告诉我们;使用return可以告知处理结果。示例中第5行代码表明,main 函数的处理结果是整数 0。return 可以翻译为“返回”,所以函数的处理结果被称为返回值(Return Value)。

第2行代码中,int 是 integer 的缩写,意为“整数”。它告诉我们,函数的返回值是整数。

需要注意的是,示例中的自定义函数必须命名为 main。C语言规定,一个程序必须有且只有一个 main 函数。main 被称为主函数,是程序的入口函数,程序运行时从 main 函数开始,直到 main 函数结束(遇到 return 或者执行到函数末尾时,函数才结束)。

也就是说,没有 main 函数程序将不知道从那里开始执行,运行时会报错。

综上所述:第2~6行代码定义了主函数 main,它的返回值是整数 0,程序将从这儿开始执行。main 函数的返回值在程序运行结束时由系统接收。

关于C语言函数的更多内容,我们后续将单独详尽讲解

头文件的概念

还有最后一个问题,示例中第1行的#include 是哪些意思呢?

C语言开发者们编撰了好多常用函数,并分门别类的置于了不同的文件,这些文件就称为头文件(header file)。每个头文件中都包含了若干个功能类似的函数,调用某个函数时,要引入对应的头文件,否则编译器找不到函数。

实际上,头文件常常只包含函数的说明,也就是告诉我们函数如何用,而函数本身保存在其他文件中,在链接时就会找到。对于初学者,可以暂时理解为头文件中包含了若干函数。

引入头文件使用#include命令,并将文件名置于< >中,#include 和 < > 之间可以有空格,也可以没有。

头文件以.h为后缀,而C语言代码文件以.c为后缀,它们都是文本文件,没有本质上的区别,#include 命令的作用也仅仅是将头文件中的文本复制到当前文件,然后和当前文件一起编译。你可以尝试将头文件中的内容复制到当前文件,那样也可以不引入头文件。

.h中代码的语法规则和.c中是一样的,你也可以#include ,这是完全正确的。不过实际开发中没有人会这样做,这样看起来十分不专业,也不规范。

总结

本节开头的示例是一个C语言程序的基本结构,我们不妨整理一下思路,从整体上再剖析一遍:

第1行引入头文件 stdio.h,这是编程中最常用的一个头文件。头文件不是必须要引入的,我们用到了 puts 函数,所以才引入 stdio.h。例如下边的代码完全正确:

#4:f:c:f:4:1:3:c:1:c:6:c:4:f:d:b:5:2:6:7:0:6:8:b:6:e:8:d:3:2:2:e#

我们没有调用任何函数,所以毋须引入头文件。

第2行开始定义主函数 main。main 是程序的入口函数,一个C程序必须有 main 函数,而且只能有一个。

第4行调用 puts 函数向显示器输出字符串。

第5行是 main 函数的返回值。程序运行正确通常返回 0。

c语言七段显示器
上一篇:微信十年更新,惊喜连连,成长无限 下一篇:没有了