购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 Linux系统下C语言的编程基础

在这一小节中,主要讲解在Linux系统环境下C语言的基础操作。这里重点介绍运算符和程序设计的三种基本结构。由于篇幅受限,不能面面俱到,如果没有任何编程语言基础的读者,建议先阅读C程序的基础书籍,这里以概述的方式来把握C语言基本体系结构。

什么是程序化的编程语言?要了解这个问题,首先要知道什么是程序。计算机对程序的定义就是:按照一定顺序执行的一系列的指令。程序的功能是控制计算机执行程序员设计的动作,它是人与计算机沟通的交流语言。

3.2.1 记住标识符

标识符是程序语言中变量名、函数名、类型名、文件名等的统称,标识符不是随便编辑的,而是有规则的,要求是字母、数字、下划线的排列组合,但是首个字符不能是数字,区分字母大小写。为什么区分字母大小写呢?换个思路理解,标识符都是由ASCII字符组成,大写A的ASCII码值是十进制65,小写a的ASCII码值是十进制97,因为ASCII码值不一样,所以C语言对字母大小写是区别对待的。理论上标识符没有字节长度的限制,但是C标准允许编译器忽略第31个字节以后的字符,也就是意味着标识符允许的最大字符是32个(0~31)。

C语言标识符不能和关键字重名,因此有些关键字不能作为标识符来使用,如表3-1所示。

表3-1 C语言的关键字表

3.2.2 C语言中的数据

对于程序来说,它的主要工作实际就是在操作各种各样的数据,这里数据是宏观意义上的,不是单纯指某个数字或者字符。C语言作为面向过程的高级语言,其核心工作就是完成程序员要求它处理的各种数据。

在C语言中有各种类型的数据,比如常量、整型变量、字符型变量、有符号、无符号等,同时这些数据类型的存储方式有大端方式存储和小端方式存储,此外还有在程序中定义的数据作用域以及链接属性等。由此看来C语言中的数据比较烦琐。

1.基本数据类型

在C语言中基本数据类型可分为4大类,分别是整型、浮点型、指针类型以及构造数据类型。我们在日常使用中看到那么多的数据类型,其实都是由这4大类基本类型衍生出来的。这里我们先讨论整型和浮点型数据,指针类型和构造类型数据在后面章节有详细介绍。

(1)整型

整型细分为长整型、整型、短整型,根据有无符号又划分为有符号长整型、无符号长整型、有符号整型、无符号整型、有符号短整型以及无符号短整型,如表3-2所示。

表3-2 整型数值表

小白成长之路:整型的注意事项

ANSI C标准并没有严格规定长整型一定要大于整型或者短整型,只是规定了三种整型的最小值范围。这需要编译器根据计算机CPU的寻址范围来定义。

(2)浮点型

浮点数也称小数或实数。例如,0.23、0.98、89.3都是合法的小数。这些常见的小数是以十进制的形式表现出来的。C语言中采用float和double关键字定义小数,float称为单精度浮点型,double称为双精度浮点型,long double是更长的双精度浮点型。这些关键字定义在float.h中,它们对应文件中的FLT_MAX、DBL_MIN和LDBL_MIN。

小白成长之路:浮点型数据的注意事项

浮点数在缺省值状态下默认是double类型的,除非有关键声明或者是在浮点数后面跟着一个L或者l,用来表示它是一个long double类型的值,或者跟一个F或f来说明它是一个float类型的值。

(3)字符型

在C语言中字符型数据只能用单引号括起来,字符串类型则使用双引号括起来。其次是字符型数据只能是单个字符或者其ASCII码的形式赋值。但是数字被定义为字符型之后就不能直接参与算术运算,比如'1 '+2=0x33。

小白成长之路:转义字符

转义字符是一种特殊的字符,它是不同于字符原有的意义,以反斜线\开头,后面跟着一个或者多个字符。例如我们前面使用的\ n指的就是换行的意思。转义字符一般用来表示字符不方便表示的控制代码。

字符变量和我们说的整型、浮点型变量类似,它的类型说明符是char。字符变量的命名规则和标识符定义的一样。字符变量在内存中通常只需要一个字节的内存空间,因此字符变量的内容就是ASCII码表中的字符。比如ASCII中字符1的十六进制形式为0x31,而在计算机中的二进制码为0011 0001。

2.常量和变量

常量是在程序中保存不变的量,在程序执行的过程中其值不能被改变,通常出现在宏定义、表达式语句、赋值语句中。此外,使用关键中const修饰的变量也是常量。

常见的常量有整型常量,如23、100;有实型常量,如3.14;有字符型常量,如a、\ n;还有字符串常量,如abc、1234。字符型属于整型的一种,因为字符型值的范围是整型数据的子集,如表3-3所示。

表3-3 字符型数值表

小白成长之路:指针常量和常量指针的区别

1)指针常量:在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。

2)指针常量本质上是一个不能修改的地址值。

3)常量指针:在常量指针中,指针指向的内容是不可改变的,指针看起来是指向了一个常量。

4)常量指针本质上是一个常量,只是可以有不同的指针来指向它。

变量在程序运行过程中,允许值的内容可以随时修改。因此要求变量在使用之前必须先声明,最好带着初始化,且必须要声明数据类型。关于变量的命名规则,可以参考标识符的命名规则。变量命名必须用字母或下划线开头,只能是字母、下划线、数字的组合,不能出现其他符号。变量名不能使用C语言中的关键字。

3.字符串

字符串是一种非常重要的数据类型,但是C语言中不存在显式的字符串类型,其中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C语言提供了一系列库函数来使用字符串,这些库函数都包含在头文件string.h中。

小白成长之路:字符和字符串的区别

1)字符通常是由单引号括起来,字符串则是由双引号括起来。

2)字符只能包含一个ASCII码值,字符串能够由一个和多个字符组成。

3)字符数据可以赋值给一个字符变量,但是字符串数据不能赋值给一个字符变量。

4)字符只占用一个字节的内存空间,但是字符串占用的字节数等于字符串中字符数再加1。增加的一个字节存放字符‘\ 0’,表示字符串结束的标志。

3.2.3 运算符和表达式

运算符是用来表示各种不同运算的符号,比如加减乘除四则运算就属于C语言中的算术运算符。除了算术运算符以外,还有关系运算符、逻辑运算符、赋值运算符、条件运算符以及逗号运算符等。

表达式则是由带有运算符的操作数组成的式子,其实运算符和表达式也可以看成一个整体,因为它们总是相辅相成的。如果抛开运算符,单看表达式是没有意义的,反之亦然。

1.算术运算符及其表达式

算术运算符不仅包括加减乘除四则运算,还包括取整和取余。乘除和取余操作优先级要高于加减运算,其中加减乘除中如果是整型之间做运算得到的还是整型,如果参与运算的两个数中有一个是浮点数,结果都是浮点型数;取余操作要求参与运算的两侧的操作数必须为整型数据,且运算结果的正负号和取余左边的操作数相同;‘/’除操作,如果两边操作数都为整数,此时是取整操作。

2.关系运算符及其表达式

关系运算符主要有大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)、小于等于(<=)这六种关系型运算符,其中大于、小于、大于等于和小于等于优先级高于等于和不等于。关系运算符常常用来判断两个表达式之间的大小关系,当关系表达式成立即值为非零数值,不成立时值为0。

3.逻辑运算符及其表达式

逻辑运算符包括逻辑与(&&)、逻辑或(| |)以及逻辑非(!)三种。逻辑表达式为真时结果为1,为假时结果为0。逻辑与的规则是两个逻辑表达式均为真,结果才为真,其他情况为假。逻辑或的规则是只要参与运算的两个逻辑表达式中一个为真结果就为真,只有两个逻辑表达式都为假时结果才为假。非零的值参与逻辑运算时,等价为1。

4.赋值运算符及其表达式

赋值运算符包括=、∗=、/=、%=、&=、|=、^=、< <=和> >=。赋值表达式的格式为:变量=表达式。赋值表达式的值等于右边表达式的值,而结果的类型由左边变量的类型决定。a+=b+c等同于a=a+(b+c),a-=b+c等同于a=a-(b+c),a∗=b+c等同于a=a∗(b+c),a/=b+c等同于a=a/(b+c),a%=b+c等同于a=a%(b+c)。

5.条件运算符及其表达式

“?:”是C语言里面唯一的一个三目运算符。“表达式1?表达式2:表达式3”,先计算表达式1的值,若为真则返回表达式2的值作为整个条件表达式的值,否则返回条件表达式3的值。

6.逗号运算符及其表达式

逗号运算符属于C语言运算符中优先级最低的,可以用作参数列表的分割符,也可以用作运算符,它的运算意义是从左向右顺序执行。逗号运算符的一般形式为:表达式1,表达式2,表达式3,……,表达式 n

7.位运算符及其表达式

位运算是直接对整型数据在内存中的二进制位进行操作。位运算有左移位操作(<<)、右移位操作(> >)、位取反操作(~)、位或操作(|)、位与操作(&)以及位异或操作(^)。

小白成长之路:自增与自减运算符

++i:先自增1,再使用i。

i++:先使用i,再自增1。

--i:先自减1,再使用i。

i--:先使用i,再自减1。

8.优先级

C语言将运算符的优先级划分为15个等级,为了便于理解运算符的优先级,又分为单目、双目和三目运算类型。单目就是只有一个对象(变量或者常量)参与运算,双目就是有两个对象,三目就是有三个对象。进一步描述运算过程,有左结合和右结合,它们的意思分别是运算过程从左向右执行和从右向左执行,如表3-4所示。

表3-4 运算符的优先级

(续)

(续)

小白成长之路:强制类型转换

在编程过程中往往需要类型之间相互转换,但是由于在起始声明时类型名称不一致,因此就需要强制类型转换。如(float)(5%3),这就将5%3的值转换成float类型。需要强调的是,在强制类型转换时,会产生一个所需类型的中间数据,而原来的变量的类型未发生变化。

3.2.4 C语言的三种基本结构

使用C语言编写的算法,无论简单或复杂,最终都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。这三种基本结构也称为程序设计的三种基本结构。实际上我们接触的其他编程语言或者脚本语言通常也包括这三种基本结构。

1.顺序结构

三种基本结构中顺序结构最简单,顾名思义,顺序结构表示程序中的各个操作按照它们在程序中的排列顺序依次执行,其流程如图3-5所示。

图3-5 顺序结构

图3-5中表示一个顺序结构程序执行的过程。对于程序来说,一般顺序结构是最外层的,因为所有的程序在执行的过程中都遵循自上而下、从左到右的执行顺序。即便是中断、回调函数也遵循这一规则,只不过它们是从程序执行的不同角度来定义的。

2.选择结构

选择结构也称为条件结构,本质上讲选择的前提是要有选择的条件,有了条件以后,程序在执行过程中,满足条件时执行某一操作流程,不满足条件时执行另一个操作流程,如图3-6所示。

图3-6 选择结构

小白成长之路:选择结构的分类

多重选择结构:该结构是指在if...else语句中的else代码块中包含其他的if语句。

嵌套选择结构:是指在if...else语句中的if代码块中包含其他的if语句。

多分支选择结构:switch...case语句用于多分支选择结构,这里需要注意的是分支条件必须是整型的表达式,分支条件的结果必须和case中的整型数保持一致,否则需要使用默认(default)分支。

条件表达式:条件表达式可以代替简单的if...else语句,但不是所有的if...else语句都可以使用条件表达式来代替,因为条件表达式必须返回一个值,所以不能调用没有返回值的函数。

3.循环结构

在编程中根据设定条件周而复始地执行固定代码段的结构,称为循环结构。循环结构的特点:在设定条件成立(为真)时,重复执行固定的代码段,直到程序不成立(为假)。循环结构分为当型循环(while)、直到型循环(do-while)以及for循环。其中for循环和while循环相似,都属于先判断后执行的循环结构,而do-while循环则是属于先执行再判断的循环结构。循环结构的一般流程如图3-7所示。

图3-7 循环结构

小白成长之路:循环结构中的跳转语句

1)break语句通常用来改变程序的控制流。break语句用于do-while循环、while循环和for循环中,可使程序终止循环而执行循环后面的语句,break语句一般和选择结构语句一起使用,比如,若选择条件为真,跳出循环,否则继续执行循环语句。换句话说,如果已经执行break语句,就不会再执行该break语句后的循环语句。需要特别注意的是,在多层循环结构中,一个break语句只能向外跳转一层。

2)continue语句的功能是跳过本次循环,转去执行下一次循环。对于while循环和do-while循环,执行continue语句完毕后的下一个动作就是去判断循环条件是否成立;而对于for循环,continue语句执行完毕后,下一个动作是变量值的更新。

3)在编程时如果使用嵌套循环,必须将被嵌套的循环语句完整地包含在外层循环的循环体中。如果程序中有需要嵌套多层循环结构,建议将执行时间最长的循环结构放在最内层、最短的循环放在最外层,这样可以减少CPU跨切循环层的次数。 ZgPwerrqu6kSbNExwEGprYiONO1wh5YMQ54qjbFVcprGs+HM/uBRJGMPxZhIXfZV

点击中间区域
呼出菜单
上一章
目录
下一章
×