物联网开发基础之初识C语言
本章重点
- C语言概述
- C语言的优势
- Visual Studio 2013开发环境搭建
- 编写HelloWorld程序
C语言是一种通用的、过程式的编程语言,它具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点。在最近二十多年里,它是最广泛的编程语言之一,被大量的运用在系统与应用软件的开发中。本章将针对C语言的发展历史、开发运行环境以及如何编译并执行C语言程序等内容进行详细地介绍。
1.1 C语言概述
每一种编程语言都有自己的发展历史,那么做为最广泛的编程语言之一,C语言也不例外。在众多编程语言中,C语言有哪些区别于其他高级语言的优势和特性呢。接下来针对C语言的由来、优势以及其他基础知识进行简单地介绍。
1.1.1 计算机语言介绍
在揭开C语言的神秘面纱之前,先来认识一下什么是计算机语言。计算机语言(Computer Language)是人与计算机之间通讯的语言,它主要由一些指令组成,这些指令包括数字、符号和语法等内容,程序员可以通过这些指令来指挥计算机进行各种工作。计算机语言的种类非常多,总的来说可以分成机器语言、汇编语言、高级语言三大类。接下来,将针对这三类语言进行简单地介绍。
1.机器语言
计算机不需要翻译就能直接识别的语言别称为机器语言,机器语言是低级语言,它是由二进制数组成的一串指令,故也被称为二进制代码语言。由于机器语言都是由二进制数组成,因此机器语言非常不便于记忆和识别。2.汇编语言
人们很早就认识到这样的一个事实:尽管机器语言对机器来说很好懂也很好用,但是记住0和1组成的指令对程序员来说简直就是煎熬。为了解决这个问题,汇编语言诞生了,汇编语言是面向机器的程序设计语言。用英文字母或符号串来替代机器语言,把不易理解和记忆的机器语言按照对应关系转换成汇编指令。这样一来,汇编语言就比机器语言更加便于程序员阅读和理解了。
3.高级语言
由于汇编语言依然依赖硬件,使得程序员在面对新的机器时不得不学习新的汇编指令,这使程序的移植性极差,因此为了解决这一问题,计算机高级语言诞生了。
高级语言不是一门语言,而是一大类语言的统称。它们比汇编语言更贴近人类使用的自然语言,易于人类理解、记忆和使用(可读性好);而且和计算机的架构、指令集无关,理论上拿到不同的平台上都可以正常使用(可移植性好),因此高级语言应用更加广泛,现在世界上绝大多数程序员都在使用高级语言进行程序开发。常见的高级语言包括C、C++、Java、VB、C#、Python、Ruby等等。本书介绍的C语言是目前最流行、最广泛的高级语言,也是公认的计算机编程语言元老。学好C语言,是掌握编程知识、了解计算机语言的基础,也是求职拿高薪的敲门砖。
1.1.2 什么是C语言
C语言是一种计算机程序设计语言,它是一种面向过程的语言,同时具备高级语言和汇编语言的优点。它既可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。,这些特性使C语言成为了最受欢迎的编程语言之一。C语言自1973年问世以来,迅速的发展当然也离不开一些个人以及组织所做的贡献。接下来,分别介绍C语言的发展历史以及C语言标准。
1、C语言的历史
早期的操作系统和系统软件主要是用汇编语言编写的,如UNIX操作系统。由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差。为了提高可读性和可移植性,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能,而汇编语言可以直接对硬件进行操作,例如,对内存地址的操作、位(bit)操作等。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性,并集它们的优点于一身的语言。于是,C语言就在这种情况下应运而生了,C语言一经发布立即成为国际上广泛流行的计算机高级语言。它适合于作为系统描述语言,即用来写系统软件,也可用来写应用软件。
C语言的发展颇为有趣。它的原型ALGOL 60语言。(也称为A语言)
1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。
1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。
1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统。
而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
为了推广UNIX操作系统,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。
1988年,随着微型计算机的日益普及,出现了许多C语言版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准学会(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言标准。
C语言发展迅速,并且成为最受欢迎的高级语言之一,主要因为它具有强大的功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ都是由C 语言编写的。用C语言加上一些汇编语言子程序,就更能显示C语言的优势了,像PC- DOS 、WORDSTAR等就是用这种方法编写的。
2、C语言的标准
美国国家标准学会(ANSI)于1989年通过了C语言的标准ANSI X3.159-1989,之后在1990年,国际标准化组织ISO也接受了同样的标准(ISO9899-1990)。这标准被称为C89或C90。两个版本的标准只有细微的差别,因此,一般而言C89和C90指的是同一个C语言标准。
后来随着时代的发展,1999年ANSI又通过了C99标准。C99标准相对C89做了很多修改,例如变量声明可以不放在函数开头,支持变长的数组等等。但由于很多编译器(特别是在嵌入式开发领域)仍然没有对C99提供完整的支持,因此本书将严格按照C89标准来进行基础讲解,在适当时会补充C99标准的规定和用法。
2011年国际标准化组织ISO发布了新的C语言标准C11(ISO/IEC 9899:2011),提高了对C++的兼容性,并引入了更多的语言特性。为什么要学习C语言
由于C语言具备简洁、紧凑、高效、灵活、可移植、使用方便,并且能够实现汇编语言的大部分功能等特性,因此从20世纪70年代起,C语言通过UNIX操作系统迅速发展起来,逐渐占据了大、中、小以及微型机,成为风靡世界的计算机语言。大多数软件开发商都首选用C语言来开发系统软件、应用程序、编译器和其他产品。
这样的现象一直保持了20年,直到20世纪90年代,一种代表着先进思想的语言问世,也就是C语言的超集C++,由于C++解决了C语言不能解决的诸多难题,所以许多开发商开始转向使用C++来解决一些复杂的,规模大的项目,C语言进入一个冷落时期。
这个时期并没有持续太长时间,随着嵌入式产品的增多,C语言简洁高效的特点又被重视起来,它再度流行起来,被广泛地用于为手机、汽车、游戏机、机顶盒、平板电脑、高清电视、VDC/DVD/MP3播放器、电子字典、可视电话、数码相机、家电控制系统等现代化设备的微处理器编程。随着信息化、智能化、网络化的发展,嵌入式系统技术的发展空间还会更加广泛,而C语言的地位也会越来越高。因此,学习好C语言是很有必要的。
1.2 环境搭建
通过前面的讲解,我们对C语言的发展史有了一定的了解。但是要想在计算机上开发C语言程序,首先需要搭建开发环境,开发环境中通常会提供自动编译工具、代码智能提示、以及代码调试等功能。这样的开发环境一般被称为集成开发环境,简称IDE。接下来就介绍一下不同操作系统下的几种常用IDE,以及Microsoft Visual Studio 2013 Express开发环境的搭建过程。
1.2.1 主流开发工具介绍
1、Microsoft Visual Studio
Microsoft Visual Studio是由微软公司发布的集成开发环境。它支持C/C++、C#、F# 、VB等多种程序语言的开发和测试,功能十分强大。目前的最新版本为Visual Studio 2013,稍早的版本包括Visual Studio 2012,Visual Studio 2010等。
本书的开发工具是Visual Studio 2013 Express,它是微软公司集成开发环境软件Visual Studio 产品的轻量版本,它最大的特点就是完全免费,虽然没有VS原版那么专业,缺少一些面向企业的功能,但其易学易用易上手的特点更加适合新手或学生用于学习软件开发。如果不是专职的开发人员,那么使用完全免费的Visual Studio 2013 Express进行学习会更加简单轻松。
2、Code::Block
Code::Block是一个免费的跨平台IDE,它支持开发C、C++和Fortan程序。Code::Block的一大特点是它支持通过插件对IDE自身的功能进行扩展,这给予了用户很大的灵活性。
Code::Block本身并不包含编译器和调试器,它仅仅提供了一些基本的工具用来帮助程序员从命令行中解放出来。不过,在Code::Block的发行版本中已经以插件的形式提供了编译和调试的功能。
3、Eclipse
Eclipse是一种广泛使用的免费跨平台IDE,最初由IBM公司开发,目前由开源社区的Eclipse基金会负责Eclipse的管理和维护。一开始Eclipse被设计为用于Java语言开发的IDE,现在Eclipse已经可以用来开发C、C++、Python和PHP等众多语言。
Eclipse本身是一个轻量级的IDE,在此之上,用户可以根据需要安装多种不同的插件来扩展Eclipse的功能。除了利用插件支持其他语言的开发之外,Eclipse还可以利用插件实现版本控制等功能。
4、Vim
和其他IDE不太相同的是,Vim本身并不是一个用于开发计算机程序的IDE,而是一款功能非常强大的文本编辑器,它是Unix系统上vi编辑器的升级版。和Code::Block以及Eclipse类似,Vim也支持通过插件扩展自己的功能。尽管Vim并不仅仅适用在编写程序而是可以适用于几乎所有需要文本编辑的场合,Vim还是因为其强大的插件功能,以及高效方便的编辑特性而被称为是程序员的编辑器。
由于Vim配置多种插件可以实现几乎和IDE同样的功能,因此,Vim有的时候也被程序员直接当做IDE来使用。
1.3 编写HelloWorld程序
1.2小节通过安装Visual Studio 2013 Express已经搭建好了C语言开发环境,下面就来体验一下如何开发C语言程序。为了让初学者更好地完成第一个C程序,接下来通过几个步骤进行逐一讲解。在上一小节中,我们已经通过Visual Studio 2013 Express开发工具完成了C语言开发环境的搭建。接下来,通过一个简单的“HelloWorld”程序,来体验一下如何使用Visual Studio 2013 Express工具开发C程序。为了让初学者更好地完成第一个C程序,接下来通过几个步骤进行逐一讲解。
- 添加源代码文件
main.c源文件创建成功后,在【解决方案资源管理器】中双击创建好的main.c文件,编写一段代码,示例如下。
#include <stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
编写完代码后请及时保存文件:点击【文件】菜单下的“保存 main.c”菜单项,或单击工具栏上的【保存】按钮即可(快捷键Ctrl + S)。如果当前文件中含有未保存的代码,文件名“main.c”之前将显示一个星号“*”。。
M脚下留心:
在编程时需要注意区分英文标点和中文标点。C语言中只能使用英文标点符号,而不能使用中文标点符号。因此请大家在输入代码时关掉中文输入法,或者切换到输入法的英文模式下。
1.4 解析HelloWorld程序
知其然,更要知其所以然。下面就以上述示例HelloWorld程序为样本进行庖丁解牛,共同研究C语言程序的基础知识,为之后的进一步学习做好准备。
1.4.1 注释
在编写程序时,为了使代码易于阅读,通常会在实现功能的同时为代码加一些注释。注释是对程序的某个功能或者某行代码的解释说明,它只在源文件中有效,在编译程序时编译器会忽略这些注释信息,不会对其进行编译,所以注释是不会影响程序运行的。
在C语言中,以“/*”和“*/”包围起来的部分被称为注释。一段注释必须由“/*”开头,由“*/”结尾,也可以由多行组成,中间任何字符都是组成注释的一部分。
为了让大家掌握如何在代码中编写注释,接下来添加注释,,具体注释效果示例如下。
#include <stdio.h> /* 这是预处理指令 */
int main() /* 主程序开始 */
{
printf("Hello, world"); /* 输出字符串 */
return 0;
} /* 主程序结束 */
如何为程序添加必要且优美的注释是一门学问。恰当的注释有助于阅读代码,而不恰当的注释往往有画蛇添足之感,一大段编码混乱而又没有注释的程序能使大家瞬间丧失阅读下去的兴趣。本书会通过示例代码让大家逐渐学会如何在代码中写出规范的注释。
在C99标准中,规定注释也可以采用“//”的写法,表示这一行从“//”开始到该行末尾都是注释内容。接下来新的注释风格添加注释,示例如下。
// HelloWorld Project
//
// Coded by xxx
#include <stdio.h> // 这是预处理指令
int main() // 主程序开始
{
printf("Hello, world"); // 输出字符串
return 0;
} // 主程序结束
阅读上述示例会发现“//”可以更加清晰的标明注释的起止位置,也更符合一般人的思维习惯。但是值得注意的是,很多旧的C编译器并不支持这种注释写法。在开发时如果遇到了莫名其妙的报错,很可能是“//”的写法不被当前的编译器支持,可以试着将其改回原有的“/* */”风格试试看。
注意到在插入了新的“*/”之后,注释的区域发生了变化。此时VS无法理解处在注释区域外的字符“*/”,因此报错。 修改代码后,请一定记得修改对应的注释,否则就会出现注释和代码对不上号的情况,不利于今后的维护。
1.4.2 预处理指令
在示例中,程序中的第一行代码“#include <stdio.h>”是预处理指令。预处理指令是指由“#”开头的一行指令。严格来说,预处理指令并不属于整个程序的一部分。也就是说,编译器在正式编译整个程序之前,会提前处理所有的预处理指令,并把它们删掉,这意味着最终用来编译的程序里是不包含这些预处理指令的。
在示例中,“#include <stdio.h>”意在告诉编译器,在真正编译之前,需要将stdio.h这一文件的内容引入到main.c中来,并且替换掉“#include <stdio.h>”这一行。
扩展名为h的文件被称为头文件(Header Files),因为其中往往包含了函数或类型的声明,且通常被放在程序的开头处。stdio.h是标准输入输出头文件,里面提供了许多和输入、输出相关函数的声明。在后面用到的printf函数就是标准函数库中的格式化输出函数(后面几章中将对格式化输出加以详细介绍),为了使用该函数,必须将stdio.h头文件引入到main.c文件中来。
除了标准的头文件之外,开发者也可以定义自己的头文件。当开发包含多个模块的复杂程序时,就会用到自定义头文件了(后面章节将针对自定义头文件进行讲解)。
M脚下留心:
标准头文件的文件名均为小写。而在Windows上,文件名没有大小写的区分,因此使用stdio.h、Stdio.h或STDIO.H都可以正确包含到同一个文件。但是在其它对文件名大小写敏感的操作系统中(比如Linux),使用“#include <Stdio.h>”可能就会收到编译器“No such file or directory”的错误提示了。因此建议在编写代码时,要严格区分头文件名的大小写。
1.4.3 主函数
一般而言,main()函数被称为程序中的主函数。所谓主函数,是指整个程序执行过程中的主体。主函数的开始标志着程序开始运行,主函数的结束意味着程序的结束(即程序退出)。除主函数之外,程序中还会有其它的函数。其它函数直接或间接地被主函数调用,以完成特定的功能。相关内容将在本书的“函数”一章中进行讲解。
函数头定义了函数的名称、返回值以及参数列表。对于例子中的主函数而言,返回值的类型是int(不懂什么是int没有关系,后面的“类型”一章会讲到),函数名称是main,括号里的内容是参数列表,现在括号中没有内容,也就意味着主函数不接收任何参数。下面来看一个略为复杂一些的例子,示例如下:
int main(void)
int main(int argc, char** argv)
上述示例括号中的void表示没有参数。在第二行代码中,参数列表中包含了两个参数,分别是名为argc的int型变量,以及名为argv的char**型变量。现在不必深究这两个参数的具体含义,只要了解主函数可以通过这两个参数取得程序运行时得到的命令行参数就可以了。
&多学一招:空函数的妙用
在C语言中,函数体可以为空,即两个大括号之间没有任何语句。这样的函数有什么作用呢?
在开发一些规模较大的程序的时候,开发者可以采用“先声明、再使用、最后实现”的策略,即先将规划好的函数定义写出来,并使其函数体为空;在编写其它函数时可以调用该;等其它函数编写完成后,再将之前定义的空函数补全。使用这种开发方式,可以方便程序的主体迅速完成,避免在一些不太重要的、边边角角的编程工作上浪费时间。
1.4.4 函数调用
在以上示例中,主函数调用了一个名为printf的函数,该函数的作用是按照一定的格式向屏幕输出信息,这个过程也被称为“格式化输出”。
printf函数并不是在本程序中实现的,而是来自C语言的标准库,也被称作标准库函数。它的声明可以在之前包含的stdio.h文件中找到。
C语言中所有的函数调用都要遵循类似的写法:首先是函数名,之后是用括号包起来的参数列表,最后是结尾的分号。C语言是大小写敏感的,因此在函数调用时,函数名必须和声明函数时使用的函数名称保持大小写一致。参数列表使用英文的逗号“,”来分隔每个参数,末尾参数后无需输入逗号。C语言所有语句都需要使用分号作为结尾。
:动手体验:替换printf的参数列表
请试着将printf的参数列表替换为“"This is my %dnd program: %s %s", 2, "Hello,", "world"”(不包括最外面的中文双引号),然后重新编译运行HelloWorld程序,并查看输出的结果。输入时请注意以下几点:
- 空格的位置;
- 逗号的位置;
- 不要使用中文标点。
1.4.5 解决错误
对于初学者而言,写程序时犯错是非常正常的,人非圣贤,孰能无错?如果代码中有错误,VS会及时地用橘红色波浪线为开发者标记出来。如果开发者不解决错误,之后的编译是无法通过的。本小节,给大家介绍一下使用VS开发程序,会遇到的一些常见错误信息,以及应该如何处理它们,示例如下。
include <studio.h>
int main()
{
printf("Hello, world")
Return 0;
}
把这段代码原封不动地输入到main.c中,替换掉原来的内容。
- 错误程序在VS中编译后的输出
,需要我们注意的是“main.c(1): error C2143: 语法错误 : 缺少“{”(在“<”的前面)”这一段话,该句话表明了“HelloWorld”程序中的错误所在,接下来,对这句话进行详细的分析。
- 错误提示信息拆解
VS编译器的每一条错误提示信息可以被拆解成四部分,分别是文件名、行号、错误编号和错误原因。开发者可以通过文件名和行号定位到出现错误的具体位置,然后根据错误原因分析出代码的问题所在。
图1-16中的错误原因是在“<”左边遇到了语法解析错误,具体是什么错误呢?可以看到main.c的第一行,在“<”的右边只有一个“include”。原来是漏掉了井号“#”。当然,现在的编译器还没有智能到告诉开发者“漏掉了一个#”,不过一般而言,指出错误的所在位置就已经足够改正程序错误了。
在“include”之前加上“#”后,重新编译,又一条错误提示信息出现了
- 新的错误
这条错误原因很简单,是说编译器没有找到“studio.h”这个文件。原来是在程序中把“stdio.h”拼错了,改正就可以了。
上述案例都是编译时发生的错误,可以通过阅读编译器的提示信息,。仔细分析原因,改正代码,重新编译。重复这几个步骤,直到程序编译成功。
有时候,一个小小的错误(比如少输入了一个分号)会导致巨大的灾难(看到成百上千条错误信息)。面对这种情况时不要慌张,只要从前到后把能发现的错误逐个改正。暂时无法确定的错误就不去管它,重新编译即可,编译后出现的错误肯定比前一次更少。
1.5 编译与运行HelloWorld程序
HelloWorld程序编写完成后,就需要对HelloWord程序进行编译和运行操作,首先点击“生成”菜单,选择“生成解决方案”选项,以编译和链接当前程序。VS界面下方的“输出”窗口会显示生成进度。当“输出”窗口中出现“成功 1 个,失败 0 个,最新 0 个,跳过 0 个”的提示时,即表示编译成功完成。如果看到“失败 1 个”的字样,则意味着main.c程序中有问题,请回到上一小节仔细对照原程序除错。。
例1-1完整的hello world程序
#include <stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
例1-1中当main.c程序编译成功后,可以通过选择“调试”菜单下的“开始执行(不调试)”选项来执行程序,之后就可以在弹出的控制台窗口中看到输出内容。
1.6 本章小结
本章首先讲解了C语言的基础知识,然后讲解了如何搭建VS2013开发环境,最后讲解了如何开发一个C语言程序。通过本章的学习,大家能够掌握如何搭建开发环境,以及如何编写一个C语言程序,通过这个程序的编写,大家会对C语言程序有一个简单的认识,并为后面的学习打下坚实的基础。
- 点赞
- 收藏
- 关注作者
评论(0)