
第1章 步入C语言的世界——Hello C
C语言是国际上广泛流行的计算机高级程序设计语言,从诞生就注定了会受到世界的关注。它是世界上最受欢迎的语言之一,具有强大的功能,许多软件都是用C语言编写的。学习好C语言,可以为以后的程序开发打下坚实的基础。现在就跟笔者一起步入C语言的世界吧。
本章要点(已掌握的在方框中打钩)
□C语言的开发环境
□开始C编程——我的第一个C程序
1.1 C语言的开发环境

学习一门编程语言之前,首先要做的就是熟悉这门语言所使用的开发软件——开发环境。下面介绍一下C语言常用的开发环境。
1.1.1 C语言常用的开发环境
C语言常用的集成开发环境(Integrated Development Environment,IDE)和编译器有Microsoft Visual C++6.0、Microsoft Visual C++.NET、Turbo C、Borland C++Builder、Code::Blocks、Dev-C++、KDevelop、Eclipse CDT等。IDE主要是在程序员开发时提供各种软件应用组件,而受程序员欢迎的IDE都有一个共同点,那就是用户界面非常有吸引力。
01 Microsoft Visual C++
Microsoft Visual C++不仅是一个C++编译器,而且是一个基于Windows操作系统的功能强大的可视化集成开发环境。自1993年微软公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的重要工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用有很大的局限性,只适用于Windows 2000、Windows XP和Windows NT 4.0。所以实际中,更多的是以Microsoft Visual C++6.0为平台。Microsoft Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft Visual C++较受推崇的是Microsoft Visual C++6.0,简称VC 6.0。
02 Microsoft Visual C++.NET
Microsoft Visual Studio.NET是Microsoft Visual Studio 6.0的后续版本,是一套完整的开发工具集。它在.NET平台下调用Framework的类库,功能强大,其中包含了Visual C++开发组件。
03 Turbo C
Turbo C是美国Borland公司的产品,是一个基于DOS平台的应用程序,也可以在Windows环境下运行。目前比较新的版本为Turbo C 3.0,常用的版本是Turbo C 2.0。Turbo C 2.0是C语言集成环境,它集编辑、编译、连接和运行功能于一身,使得C程序的编辑、调试和测试非常简捷,编译和连接速度极快,使用也很方便。它提供了两种编译方式,一种是命令行方式,另一种是集成开发环境。
04 Borland C++Builder
Borland C++Builder是Borland公司继Delphi之后推出的一款高性能集成开发工具,具有可视化的开发环境,是基于C++语言的快速应用程序开发工具。C++Builder充分利用已经发展成熟的Delphi的可视化组件库,吸收Borland C++优秀编译器的诸多优点,结合先进的基于组件的程序设计技术,已成为一个非常成熟的可视化应用程序开发工具。C++Builder可以快速、高效地开发出基于Windows环境的各类程序,尤其在数据库应用和网络应用方面,更是一个十分理想的软件开发平台。
05 Code::Blocks
Code::Blocks是一个开放源码的全功能的跨平台C/C++集成开发环境,在Linux、macOS、Windows操作系统上都可以运行,且自身体积小,安装非常方便。它拥有简洁的用户界面,高效的编译器和调试器等,而且不需要购买许可证,上手难度不高,是一款轻量却又不失强大功能的好软件,支持GCC和g++(Linux操作系统下)。Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(2.6.2 unicode版)。
不同版本的C语言编译系统,所实现的语言功能和语法规则又略有差别,因此读者应了解所用的C语言编译系统的特点,这可以参阅有关手册。
本书主要是以Code::Blocks 16.01为程序开发环境,因为它功能完善,操作简便,界面友好,适合初学者开发使用。它除了能够完成最基本的编辑、编译、调试的功能,还具备以下特点。
(1)开源。
开源全称为开放源代码。开源软件的本质是开放,也就是任何人都可以得到软件的源代码,并在版权限制范围内使用。
(2)跨平台、跨编译器。
Windows、Linux、mac OS操作系统都可以使用,即使将来更换了设备也无须担忧。支持多款编译器,只要简单配置就可以轻松切换GCC/g++、Visual C++、Borland C++、Intel C++等20多款编译器。
(3)插件式框架。
初学者可能无法理解框架的概念,简单说就是方便添加各种小功能。
(4)采用C++写成。
运行环境非常简单,不用安装其他庞杂的架构。
(5)升级频繁与维护良好。
几乎每个月都有升级包,还有热心网友提供的各种功能包。
(6)内嵌可视化GUI设计。
IDE的图形界面,采用了wxWidgets。
1.1.2 Code::Blocks开发环境
Code::Blocks 16.01下载完成后会得到一个安装包(.exe可执行文件),双击该文件即可开始安装。具体安装过程如下。
双击.exe文件,直接进入安装程序,如下图(左)所示,单击【Next】按钮。
同意Code::Blocks的各项条款,如下图(右)所示,单击【I Agree】按钮。

选择要安装的组件,默认选择Full全部安装,如下图(左)所示,然后单击【Next】按钮。
选择安装路径时,默认位置即可,也可以安装在任意位置,但是路径中不要包含中文,如下图(右)所示,然后单击【Install】按钮。

等待安装。安装完成后,如下图(左)所示,单击【Finish】按钮。
打开【开始】→【所有程序】,会发现多了一个名为“CodeBlocks”的文件夹,如下图(右)所示,证明Code::Blocks已安装成功,同时在桌面上也会产生CodeBlocks的快捷方式。

启动Code::Blocks 16.01,窗口如下图所示。

1.1.3 手机编译器
对于没有计算机,或者计算机不在身边的读者,也可以使用手机随时学习C语言,只需要在手机上安装C语言的编译器。不过由于手机屏幕限制,虚拟键盘使用非常不便,因为要经常在英文、数字、符号之间切换,代码编写效率较低。
目前,比较常用的手机编译器有C4droid、C语言编译器、Quoda、AIDE、CppDroid、Mobile C等。这些软件需要到手机的“应用商店”或者官网中下载安装,有些是需要付费的。
本书主要介绍在安卓系统中使用的一个用户友好、功能强大的C/C++IDE和编译器C4droid。C4droid默认使用TCC(Tiny C Compiler)为编译器,可以选择安装GCC插件和SDL插件库(不需要ROOT)。选用GCC后,可以用SDL(简单直控媒体层库,需安装SDL plugin for C4droid)和QT(Nokia官方开发库,需安装SDL plugin for C4droid);也可以开发Native Android App(需安装SDL plugin for C4droid),就像Google NDK一样。GCC插件的4.7.2版本提供了示例程序,包含SDL、Android Native、QT和命令行测试程序源码。
C4droid支持离线C语言编译器、源代码编辑器、语法高亮、标签、自动补全代码、代码格式化、文件关联和撤销/重做、调试器、可定制的图形用户界面等常用功能,编译时间随手机CPU主频而定,主频越高编译越快,支持将程序打包成.apk安装包。
下面介绍笔者安装C4droid的具体过程。
首先在计算机上搜索“C4droid安卓汉化版”,通过手机扫码或者用连接线的方式把手机连接到计算机上,直接把软件下载到手机上并进行安装,如下图(左)所示。
安装成功后,在手机桌面上会出现C4droid的图标,如下图(右)所示。

在安装过程中出现“Do you want to install GCC?”提示,这时选择【Yes】。当出现“You need to install GCC for C4droid from Google Play,proceed?”提示时,选择【OK】。
GCC和SDL也可以在软件安装完成后单独安装。单击手机桌面上的C4droid图标,启动C4droid,单击右上角下拉按钮,选择【Preferences】选项,找到【Install GCC】和【Install SDL】就可以进行安装了,如下图所示。



当然读者也可以直接在手机的“应用商店”中搜索“C4droid”,可以找到很多类似的应用程序。
1.2 开始C编程——我的第一个C程序

C语言集成开发环境比较多,没有必要对每一种开发环境都熟练地掌握,只需要精通一种开发环境即可。下面在开发环境中学习编写第一个C程序。
1.2.1 程序编写及运行流程
汇编程序要转换成可执行文件(可以理解为能够“单独运行”的文件,一般在Windows操作系统中常见的可执行文件为.exe、.sys、.com文件等),需要通过汇编器来实现。那么,对于用C语言编写的代码,是如何把它转换为可执行文件的呢?
要转换C语言源代码为可执行文件,需要借助的工具是编译器(Compiler),转换的过程叫作编译。经过编译生成目标程序,目标文件是机器代码,是不能够直接执行的,它需要有其他文件或者其他函数库辅助,才能生成最终的可执行文件,这个过程称之为连接,使用的工具叫作连接器。
C程序的编写和运行流程如下图所示。

我们把编写的代码称为源文件或者源代码,输入、修改源文件的过程称为编辑。在这个过程中还要对源代码进行布局排版,使之有层次、方便阅读,并辅以一些说明的文字,帮助我们理解代码的含义,这些文字称为注释。它们仅起到说明的作用,不是功能代码,不会被执行。编辑的源代码经过保存,生成扩展名为“.c”的文件。这些源文件并不能够直接运行,而需要经过编译,把源文件转换为以“.obj”为扩展名的目标文件。此时目标文件再经过一个连接的环节,最终生成以“.exe”为扩展名的可执行文件。计算机系统能够运行的是可执行文件。
1.2.2 在Code::Blocks中开发C程序
启动Code::Blocks 16.01并新建程序。
范例1-1 使用Code::Blocks 16.01创建C程序并运行。
第1步:创建.c文件,如下图(左)所示,在Code::Blocks窗口中单击【Create a new project】。
当然也可以用菜单或者功能按钮区域里的命令按钮来创建新文件。在【New from template】对话框中选择【Files】→【C/C++source】,如下图(右)所示,单击【Go】按钮。

在【C/C++source】对话框中选择【C】,如下图(左)所示,单击【Next】按钮。
在“Filename with full path:”下的文本框中输入完整的文件名“1-1.c”,注意不要出现全角字符,然后单击文本框右边的【...】路径选择向导按钮,如下图(右)所示,选择文件保存路径后,单击【Finish】按钮。

在主窗口的工作区中可以看到多了一个名字为“1-1.c”的文件选项卡[见下图(左)],现在可以在这里面输入以下代码(代码1-1.txt)。
#include <stdio.h> /*包含标准输入输出头文件*/ int main (void) /*主函数*/ { /*函数体开始*/ printf(“Hello C!\n”); /*在屏幕上输出Hello C!*/ return 0; /*主函数结束后返回值0*/ } /*函数体结束*/
第2步:运行程序。
单击功能按钮区中的【Build and Run】按钮,程序直接完成编译、连接和运行工作,如下图(右)所示。

在程序执行窗口中输出程序的结果,如下图所示。

提示
如果程序在编译时有语法错误,则不出现运行结果,会在代码编辑工作区下面的“Logs & others”窗口中显示“第×行……(错误信息)”,这时可以按照这些提示信息修改代码,重新编译、运行,直到没有语法错误,并且能够在程序执行窗口中输出程序的结果为止。对应快捷键:编译【Ctrl+F9】,运行【Ctrl+F10】。
1.2.3 在手机编译器中开发C程序
单击手机桌面上的C4droid图标,启动C4droid。
第1步:在提示行中直接输入代码,如下图(左)所示。
第2步:运行程序。
单击窗口底部功能按钮区中的【RUN】,程序直接完成编译、连接和运行工作。如果代码有语法错误,窗口中会出现错误提示,如下图(右)所示,提示错误出现在第一行中,点击屏幕,回到编辑窗口中修改所有错误。

重新单击【RUN】,直到在程序执行窗口中输出正确的结果,如下图(左)所示。此时点击屏幕回到编辑窗口中。
第3步:保存程序。
窗口底部功能按钮区中的【OPEN】【NEW】【SAVE】【COMPILE】可以打开文件、创建新文件、保存文件、编译文件。如点击【SAVE】,在提示窗口中输入完整的文件名即可保存,如下图(右)所示。

1.3 高手点拨

学习任何一种编程语言,实践练习都是十分重要的,不要只看不练、眼高手低。要活学活用,看完课本中的范例之后,自己要在开发环境中独立操作一遍,不能认为简单而不亲手去操作。在编写C语言程序时,一定要注意养成好的书写习惯,好的书写习惯是一名优秀程序员具备的基本修养。一段程序可以反映一个人的编程水平,所以,针对C语言编程的书写,有以下4点建议。
(1)在每个程序文件最前面注释编写日期、程序的功能。
(2)代码格式要清晰,避免错乱;每段代码后面要注释这段代码的功能,便于以后的修改和查看。
(3)程序的模块化,也就是说对于一些功能复杂的程序,除了main()函数之外,还要定义其他函数,以免main()函数中的程序烦琐,也便于其他函数调用某个功能模块。例如,一个程序既要对整数排序,又要实现比较大小,那么可以将排序的程序放在函数A中,将比较大小的程序放在函数B中,然后在main()函数中调用这两个函数就可以了。如果其他函数中的整数也要排序,只需调用排序函数A就可以了,避免反复书写同样功能的程序段。
(4)函数命名规范化,例如,某段程序专门实现排序,可以将这段程序放到一个自定义函数中,将这个函数命名为“order”。因为order有排序的意思,这样命名可以一目了然,阅读程序的人通过函数名就可以知道该函数实现什么样的功能,便于理解。
1.4 实战练习

在Code::Blocks中编写C程序,在程序执行窗口中输出如下一行内容:“你好,世界!”