C语言讲稿 下载本文

第1章 C 程序概述

人与计算机交换信息是要用语言来交流的,这种语言称为计算机语言。用计算机语言编写的代码称为程序。计算机的工作是受程序控制的,而从计算机角度来说,程序是用某种计算机能理解并执行的计算机语言来描述解决问题的方法步骤。

程序设计语言经历了从机器语言、汇编语言到高级语言这样一个发展过程。 1.

机器语言:计算机刚诞生时,还没有可以用来方便地指

挥计算机工作的程序,计算机程序是直接用它能识别的二进制指令来书写的。这种程序设计语言就是机器语言。它直接以计算机硬件产生作用的,所以不同型号的计算机的“机器语言”又不一样,因此它被称为低级语言,很难被人掌握,只有少数专业人员能使用。

2.

汇编语言:实际上是一种符号化的机器语言。在汇编语

言中每条机器指令对应一个符号化的指令。如:用ADD代表机器二进制的加法运算。因为加法用二进制的10110110的机器语言代表,而用英文单词更简捷且好记多了。不过,用汇编语言编写的程序要翻译成机器语言才能被计算机执行。且也依赖于机器。

3.

高级语言:由于汇编语言和机器语言都是面向机器的语

言,而且在程序的书写形式上很难直观地反映出程序设计者的思路,因此人们发明了与人类的自然语言非常接近的高级

1

程序设计语言。高级语言不仅易学,易用,而且写出的程序更加简练,同一个程序还可以用在不同型号的机器上。比如说,我们要求两个数的和,在高级语言中可以用一个很简单的语句C=A+B;来表示,但在汇编语言或者机器语言中,这可能就是几条甚至几十条机器指令构成的一个实现加法的程序,常人要读懂它也不是那么容易。

但是,用高级语言编写的程序不能被计算机直接理解和执行,而必须先由这种语言的编译程序或者解释程序翻译成机器指令,然后再让计算机执行机器指令。

C语言的历史

20世纪70年代初期出现的FORTRAN,ALGOL和PASCAL语言是反映了结构化程序设计思想的高级语言,PASCAL它在大学和研究所中流传较广曾为国内外计算机(应用)专业学生的入门语言。

几乎同时与之诞生的C语言在美国的贝尔实验室中诞生,与其它语言不同的是,C语言诞生之时,没有什么研究报告和语言报告,而是在设计Unix操作系统时不断地得到更新和完善。因此,人们把C语言程序称为程序员设计的语言,而把FORTRAN,ALGOL和PRASCAL语言称为计算机科学家设计的语言。 Unix的早期版本是用汇编语言写的,而用C编写的Unix原先的版本更易于理解、修改的扩充,更重要的是,具有良好的可移植性。作为一个优秀的操作系统,Unix在世界范围内得到了

2

广泛的应用,它的设计者因此于是1983年获得了计算机科学的最高奖——图灵奖。C语言是一门极具有生命力的程序设计语言。由于C语言同时具有一些低级语言的特性,所以许多人把C语言称为中级语言。要使用Unix,就必须掌握C语言,渐渐地C语言已不完全依赖于Unix,成为程序员的首选语言之一,在国内,许多高校将C语言作为第一门程序设计语言开设 1978年,贝尔实验室的B.W.Kernighan和D.M.Ritchie(简称K&R)出版了“THE C PROGRAMMING LANGUAGE”一书,建立了所谓的C语言的K&R标准,它一度成为C语言的事实标准。目前,美国国家标准学会已对C语言标准化,称为ANSI C 标准。ANSI C 标准和K&R标准是有一些差别的,本课程是以ANSI C 标准为主再加上Borland公司Turbo C2.0的一些扩充。

C语言本身也在发展,20世纪80年代中期,出现了面向对象的程序设计的概念。贝尔实验室的B.stroustrup博士借鉴了Simula67中的类的概念。将面向对象的语言成份引入到C语言中,设计出了C++语言,C++语言赢得了广大程序员喜爱,不同的机器不同的系统几乎都支持C++语言,同时,C++语言也得到了国际标准化组织(ISO)的认可。C/C++语言对新的形成的语言也有较大的影响力。20世纪90年代中期以来,Internet日益普及,用于Internet开发的JAVA语言渐为人们所熟知,事实上,JAVA语言与C++语言极为相似,熟悉C++语言的程序员在很短

3

的时间内就能掌握JAVA。

C语言的特点:C 语言是目前最流行的、也是最优秀的

一种高级程序设计语言。它于1972年在美国的贝尔实验室问世,后来历经发展和完善。它不仅具有高级语言的易学、易用、可移植性强等优点,而且具有低级语言的执行效率高、可对硬件直接进行操作等优点受到了广大计算机应用人员的喜爱,同时C语言几乎任何一种机型、任何一种操作系统都支持C语言的开发。 总的来说,C语言具有以下几方面的特点:

1. 比其它高级语言更接近硬件,比低级语言更接近算法,程序易编、易读、易查错、易修改。可以说兼有高级语言和低级语言的优点,允许直接对位、字节和地址进行操作。 2. 数据类型和运算符十分丰富,程序设计和算法描述更为简单和方便。

3. 语法结构十分简单,语句数目少,简单易学。

4. C语言是面向结构化程序设计的语言,提供了完整的程序控制语句(选择语句和循环语句),很适合结构化的程序设计方法,生成的目标代码质量高。

5. 它是一种模块化程序设计语言,适合大型软件的研制和调试。 它提供了大量的库函数供调用,简化了程序设计工作。

4

学习C语言所需的知识

1. 弄清数据在内存中的表示方法,数据在计算机内部是用二进制来表示的,为了便于问题描述,常常还用到十六进制和八进制;

2. 数制及转换(二进制、十进制、八进制、十六进制) 3. 整数的原码、补码、反码表示

整数有正负之分,用一个二进制位作为符号位,一般总是最高位,当符号位为“0”时为正数,符号位为“1”时为负数。如:用16位来表示一个整数时有: 0000000000101011=+43 1000000000101011=-43

上述表示法,称为整数的原码表示法。

整数的反码表示法是:符号位作为“1”,绝对值部分正好与原码相反(即0变为1,1变为0) (-43)原=1000000000101011 (-43)反=1111111111010100

但在计算机内部整数大多数用补码表示,对符号位作为“1”,绝对值部分却是反码的最低位加1得到的结果,因此 (-43)补=1111111111010101

对正整数而言,其原码、反码、补码均相同 对于补码的知识,是C语言的必备的知识

5

C程序的上机步骤: 在Turbo C的环境下若要得到运行结果 1. 将源程序输入到计算机内称为编辑阶段,它将产生出以‘.C’为扩展名的源程序文件。 2. 将源程序翻译成计算机能识别的二进制目标代码称为编译阶段,因为源程序不能直接执行,须将它翻译成机器能识别的目标程序,它会产生出以;‘.OBJ’为扩展名的目标程序文件。 3. 目标文件不是可执行文件,不能直接运行,还要把目标和系统提供的库函数等连接起来此过程为连接阶段,它将产生 ‘ . EXE ’ 为扩展名的可执行程序文件 4. 运行可执行文件获得结果称为执行阶段 总之: C程序的上机运行要经历上述四个步骤即:编辑、编译、连接、运行过程运行图如下: 编辑 E1.c 编译 E1.obj 连接 E1.exe 运行输出结果

6

第2章C语言的程序基本结构 C程序是由C语句组成的语句序列,C语言程序是由函数组成的,每一个函数完成相对独立的功能,函数是C语言程序的基本模块单元。通常一个C程序包括一个或多个函数,其中必定有一个函数为主函数,其函数名为main。 main是函数名,函数名后面的一对圆括号“()”是用来写函数的参数的。参数可以有,也可以没有,但圆括号不能省略。 C语言程序中的函数,都由函数头与函数体两部分组成,函数头包含函数类型、函数名、函数参数及其类型说明表等;函数体是指函数头下面由一对花括弧括起来的那一部分内容,里面内容是对函数内部所用变量进行的说明各是对函数所要完成工作的语句描述要特别强调的是,在C程序中,每一个语句都以分号“;”结束。例如:以下几个C程序函数类型 [例题1] 函数头 int square(inty) { int z; 变量说明 函数类参数及类型说明表 函数名 函数体 z=y*y; 语句 return(z); }

7

[例题2] 求三个实数的平均值,三个实数由键盘输入 /*定义主函数*/ main()

{float x, y ,z, a; /*定义四个存放实数的变量x, y, z, a*/ scanf(“%f,%f,%f,&x,&y,&z);/*输入三个实数并存放到变量x, y, z中*/ a=(x+y+z)/3; /*计算x, y, z的平均值存入变量a中*/

printf(“%f\\n”,a);} /*输出变量a中的三个实数的平均值*/ [例题3] 求三个实数的平均值,三个实数由键盘输入

/*定义一个名为avg的函数, 函数有三个形式参数x1,x2,x3,函数的返回值为实数*/

float avg (x1,x2,x3) float x1,x2,x3; {

float a1; a1=(x1+x2+x3)/3; return(a1); }

/*定义主函数*/ main()

{float x, y ,z, a;

scanf(“%f,%f,%f,&x,&y,&z);

a=ave(x,y,z); /*调用函数ave计算平均值存入变量a中

8

*/

printf(“%f\\n”,a); }

[例题4] 求三个整数的最大的最小值,三个数由键盘输入

/*定义一个名为max的函数, 其功能是返回三个形式参数中的最大值*/

int max(i1,i2,i3) int i1,i2,i3; {int m1;

if ((i1>=i2)&&(i1>=i3)) m1=i1; if ((i2>=i1)&&(i2>=i3)) m1=i2; if ((i3>=i1)&&(i3>=i2)) m1=i3; return(m1); }

/*定义一个名为min的函数, 其功能是返回三个形式参数中的最小值*/

int min(i1,i2,i3) int i1,i2,i3; {int m1; if (i1<=i2)

if (i1<=i3)) m1=i1; else m1=i3; else if (i2<=i3) m1=i2; else m1=i3; return(m1);

9

}

/*主函数*/ main()

{int x, y ,z, a;

scanf(“%f,%f,%f,&x,&y,&z); a=max(x,y,z); printf(“max=%d\\n”,a); a=min(x,y,z); printf(“min=%d\\n”,a); }

从上述三例中,可以看出:

? C程序由若干个函数构成的。每个C程序有且仅一个主函数,该主函数的函数名规定为main。函数是C程序的基本单位。 ? 除主函数以外,可以没有其他函数如[例题2],也可以有一个或多个其它函数如[例题3] [例题4]

? 每个函数(包括主函数)的定义分为两部分:说明部分和函数体。

? 函数体中的数据说明语句,必须位于可执行语句之前。换句话说,数据说明语句不能与可执行语句交织在一起。 ? 语句的最后总要有一个“分号(;)”,作为结束 ? 可以用‘/**/’作为“注释”用于说明该段程序的功能 ? 书写灵活,在一行可以写多个语句,一个语句也可写在多行

10

? C程序的执行总是从主函数开始,并在主函数中结束。主函数的位置为任意的;即函数的定义次序不影响其引用次序。其它函数总是通过函数调用语句来执行的,因此,一个C程序实质上是一系列相互独立的函数的定义,函数之间只存在引用和被引用的关系。

? 主函数可以调用任何非主函数;任何非主函数都可以互相调用,但是不能调用主函数。

? C语言编译系统区分字母大小写。C语言把大小写字母视为两个不同的字符,并规定每条语句或数据说明均以分号(;)结束。分号是语句不可缺少的组成部分

? 一个C程序可以由一个文件组成,也可以由若干个文件组成。每个文件中包含一个或多个函数。当一个C程序由多个文件组成时,每个文件进行编译(生成.obj文件),再通过连接合并成一个可执行文件(生成.exe文件),然后运行。

C语言的基本词法

C语言是一种计算机语言,也要先学基本字符,基本词类字符集

一、C语言的字符集:在C语言程序中允许出现的所

有基本字符的组合称为C语言的字符集。C语言的字符集就是ASCII字符集,它由数字、英文字母、图形符号以及转义字符四部分组成。

11

1. 数字(0~9)

2. 大小写英文字母(52个)A~Z;a~z 3. 键盘符号(33个)

4. 转义字符:由“反斜杠字符(\\)”开始后跟单个字符或若干字符组成的,通常用来表示键盘上的控制代码或特殊符号,如回车换行符,响铃符号等

二、保留字:在C语言的程序中有特殊含义的英语单词称

为“保留字”,主要用于构成语句成份,进行存储类型和数据类型定义的那些单词,有时也称为“关键字”;C语言的保留字只能小写

C语言保留字如下:

Auto 自动extern 外部sizeof计算字节数 break中止 float 浮点static 静态case情况 for 对于struct 结构char字符 goto转向 switch开关 contiune继续 int 整形typedef 类型定义const 常量if 如果union 共用default 缺省long 长整型unsigned 无符号do 做register 寄存器void 空double 双精型return 返回volatile可变的 else 否则short短整型 while当 enum枚举 signed带符号

标识符:标识符是用户自定义的一种字符序列,通常用来表

示程序中需要辩认的对象所取的名称,如符号常量、变量、数组、函数标号等对象的名字的字符序列;

C语言规定,标识符是由字母或下划线(_)开头,后面跟零个或多

12

个字母、数字、下划线组成的一串符号 。在Turbo C中,最长的标识符可达32个字符;

正确的的标识符:sum I a2 a_2 _a2 _a_2 不正确的的标识符:2a (非字母或下划线的开头)

a? (含有非字母、数字、下划线的字符:?) c.g (含有非字母、数字、下划线的字符:.) a-2 (含有非字母、数字、下划线的字符:-) #abc(含有非字母、下划线开头的字符:#) C语言是区分大小写的如int 为保留字 Int 则为标识符,原则上用大写字母来表示常量标识符,而用小写字母表示变量和其他类型标识符;

由于标识符主要是用来命名,所以用户应选取有意义的标识符,以便在程序中能从标识符看出所标识的对象。增加程序的可读性 C语言规定用户选取的标识符不能是C语言规定的保留字 C语言规定所有的符号必须先定义/说明而后使用。

C程序的书写格式:

标识符的大小写是有区别的。如A和a 表示两个不同的变量, C程序语句用分号(;)结束,分号是C语句的必要组成部分 C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。

在程序中可以对程序进行注释,注释部分必须用符号“/*和*/括

13

起来,但/**/要成对出现

C语言的词类

主要分为下列几种 常量

在程序中其值不发生变化的数据

变量

用来存放程序运行中变化的数据,如原始数据、中间结果、最终结果等

运算符

用来表示简单加工计算的符号如 加(+)减(—)乘(*)除(/) 函数调用

形如“函数名(实际参数表)”的式子,它代表调用指定函数后获得的结果

表达式

用常量、变量、函数调用、运算符组成的式子。用来表示简单的加工计算;

保留字

在程序或语句中,用于表示特定语法含义的英语单词

C语言的基本语句

(1) 数据定义语句:用于定义程序中使用的各种能存放数据

的对象的名称和特性

14

(2) 赋值语句:如“变量=表达式”的语句

(3) 函数调用语句:如“函数名(实际参数表)”的语句 (4) 表达式语句:

(5) 流程控制语句:用于控制程序执行过程的语句 (6) 复合语句:用花括号括住的若干个任意语句 (7) 空语句:无任何操作的语句

(8) 其他语句:包括编译预处理命令、类型定义语句等

第3章数据类型、运算符、表达式 §3.1 C语言的数据类型:

数据类型是指数据的内在表现形式,即是数据在加工计算中的特征就是数据类型。在C语言中,为解决具体问题,要采用各种类型的数据,数据的类型不同,它所表达的数据范围、精度、和所占据的存储空间均不同。在高级语言编写程序中,必须在程序中做好两件事:一是描述数据,二是描述数据的加工方法,前者是通过数据定义语句实现的,后者是通过若干执行语句,包括用各种运算符构成的表达式来实现的

C语言常用的数据类型有(基本类型、构造类型、指针类型、空类型)其中整型、实型、字符型称为基本类型。

整型

整型可分为四种:基本型、长整型、短整型和无符号型 1.基本型 用int表示

15

2.长整型 用long int或long表示 3.短整型 用short int或short表示 4.无符号型 无符号型的整数必须是正数或是零。 实型(浮点型) 实型(浮点型)用来表示实型数据,它又分为两种:单精型和双精型,分别用float和double表示,它们的有效数字分别为7位和15位 字符型 字符型用char表示,一般用8位来存放一个字符,实际上存放的是它的ASCII码值(即一个整数)。因此,字符型和整型关系密切,可把字符型看成一种特殊的整型 C语言提供的类型如下: 整型(int) 单精型(float) 实型(浮点) 基本类型 双精型(double) 字符(char) 枚举型 数组型 构造类型 结构体型 数据类型 共用体型 16

指针类型

空类型

我们将整型和实型合称为“数值型”,把数值型和字符型合称为“基本数据类型”

构造类型是指由若干个相关的基本类型数据组合在一起形成的一种复杂的数据类型。

数组是由相同的数据组合而成:如若干个人的年龄的组合即为一个数组

结构型是由不同的数据类型组合而成的:如人的姓名(字符串)、性别(字符型)、年龄(整型)、基本工资(实型)组合在一起,构成一个结构型数据。

共用型是若干个数据不同时使用时,让它们占用相同的内存区域,以便节省内存,这些数据组合在一起就是“共用型”共用型中的数据可以是同类型的数据也可以是不同类型的数据。 指针型是一种简单的数据类型,它是用来表示内存地址的。指针类型的数据可以表示基本类型数据的地址,也可以表示结构类型数据的首址的其中某个具体数据的地址。

枚举型是指在某个数据在程序运行过程中,只取固定的几个值,就可以把这几个值列出来以后这个数据只能到这几个值中的某一个

17

空类型是从语法完整性的角度给出的一种数据类型,表示该处不需要具体的数据值,因而没有数据类型。 对每个数据都要在内存中(个别数据可能在寄存器中)分配若干个字节,用于存放该数据;数据所占用的内存字节数称为该数据的“数据长度”。不同的数据的长度是不同的,因此,C语言规定每使用一个数据之前,必须对数据的类型加以定义,以便为其安排长度合适的内存。一般用8位来存放一个字符,实际上存放的是该ASCII码值(即一个整数),因此,字符型和整型关系非常密切,可以把字符型看成一种特殊的整型。 各种整型数据所占位数及数的范围 数据类型 Int Short Long Unsigned Unsigned short Unsigned long 所占位数 16 16 32 16 16 32 数的范围 -32768~32767 -32768~32767 -2147483648~2147483647 0~65535 0~65535 0~4294967295 各种实型数据所占位数及数的范围

18

数据类型 Float Double 所占位数 32 64 有效数字 7 15 数的范围 10-38~1038 10-308~10308 §3.2 常量与变量 C语言中数据有常量与变量之分, 一、常量:在程序执行过程中其值保持不变的数据称为“常量”。常量也称为常数。 在C语言中常量包括整型、实型(浮点型)、字符常量、字符串常量和符号常量这些数据类型。 常量是不需要事先定义的,只要在程序中需要的地方直接写出该常量即可。 整型常量:即整常数,由一个或多个数字组成,可以带正负号。其中数字0开头的为八进制数,以0X或0x开头的为十六进制数,否则为十进制数。 如:十进制数:25,3.14 ,-32768,0等 八进制数:0124表示八进制的124,-0111表示八进制的 -111 分别表示十进制数的84和 –73 十六进制数:0x15表示十六进制的15,-0x12表示 十六进制的-12 分别表示十进制数的21和 –18 19

在整型常量后跟有字母l或L时,表示整常量是长整型量 如:4987L,0X4F8DAL

整型常量在微机中占用2个字节,不管是十进制数、八进制 数、十六进制数

实型(浮点型)常量:实型常量也称为(浮点型)常量在C

语言中实型常量只使用十进制数它的书写方法有两种形式:一般形式和指数形式。

一般形式的实数:它由整数、小数点、小数三部分组成,小数点

是必须的整数和小数可以省略如:12.345、 –1.2345 、0.618、 .123、 123.等

指数形式实数:由尾数、小写字母e或大写字母E、以及指数三

部分组成、字母e或大写字母E必须有。尾数可以为整数也可以为实数,指数部分只能是整数 (可以有“+”“-”符号) 公式为:尾数×10

指数

如:

2.75e、36.E-5、.123E+4为合法指数形式,而1234、.E-8 、e3 、8.75e3.3等都为不合法指数形式

字符常量:是用两个单引号前后括住的单个字符来表示的,如:

‘b’、‘G’、‘%’、‘1’‘=’。

在C语言中字母是区分大小写的所以‘A’与‘a’是不同的字符常量

在内存中每个字符常量都占有一个字节,具体存放的是该字

20

符对应的ASCII代码值

字符串常量:是用两个双引号前后括住的零个或多个字符来表

示的。如:“abc”、“12345”、“abCDEF”

字符串长度:一个字符串常量中所包含的字符个数称为该字符串

的长度,其中每个转义字符只当一字符。如:“abc”、“abCDEF”、“\\\\ABCD\\\\”、“\\101\\”的长度分别为3、6、6、4见例chxu\\Name14,oo3

符号常量:符号常量是常量的另一种写法,在程序中为了明确看

出某些常量所表达的对象,可以用特定的标识符来表示这些常量。通常是在程序的开头先定义所有的符号常量,程序中凡有使用这些常量的地方都可以写成对应的标识符 如:#define PI 3.14159和#define R 10 则分别定义了符号常量PI和R 的值分别为3.14159 和10程序中使用符号常量有两点好处:一是修改程序方便,二是为了阅读方便

二、变量:是指在程序运行过程中其值可以发生改变的量。通常

是用来保存程序运行过程中的输入数据计算获得的中间结果各最终结果。

变量可以为任何一种数据类型。如:基本数据类型、数组型、结

构型、共用型等构造类型和指针型、枚举型。通常将具有某种类型的变量就叫做该类型的

21

变量。如:长整型变量、指针变量、字符型变量等,但是,字符串只能是常量,C语言中没有字符串变量。一个变量由一个名字来标识,此名字称为该变量的标识符,其取名规则同标识符,其中的英文字母常用小写,一般取名建议见名取意,以便让程序更加明了 变量在内存中占据一定的存储单元,该存储单元中存放变量的值。注意:变量名和变量值是两个不同的概念,变量名与内存中的某一存储单元相联系,而变量值是指存放在该存储单元中的数据的值,因此,同一个变量名对应的变量在不同的时刻可以有不同的值。当程序运行时,每个变量都要占用连续的若干个字节,所占用的字节数由变量的数据类型确定。其中第1个字节的地址称为变量的地址。C语言规定,程序中变量的地址用“&变量名”来表示的。数据在计算机中占用内存字节数如下:见例chxu\\size 各种变量数据所占字节数及数的范围 数据类型 Int Short Long

所占位数 2或(4) 2 4 数的范围 -32768~32767 -32768~32767 -2147483648~2147483647 22

Unsigned unsigned short unsigned long Float Double Char 2或(4) 2 4 4 8 1 0~65535 0~65535 0~4294967295 7 15 -128 ~ +127 变量的定义:每个变量在使用之前都必须定义,定义 的内容之一就是说明其数据类型;定义格式如下: <类型标识符> <变量名> {,<变量名>}; 其中用{ }括起来的内容可以重复零次或多次。变量说明实例如下: int i; short c,d,e; unsigned long p,g; float x,y; double z; char ch1,ch2; 上述变量被定义后,根据其类型的不同 ,拥有不同大小的存储单元,对变量进行时注意如下: 变量的定义可以放在函数之外,也可以放在函数体内或复合语句中,若放在函数体或复合语句中,则必须集中放在最前面. 见例chxu\\Name5,zhb

23

§3.3 运算符与表达式

一、运算符

用来表示各种运算的符号称为运算符:

按功能分为:算术运算符、赋值运算符、关系运符、逻运算符、

位运算符、递增/递减运算符、取地址运算符、逗号运算符、条件运算符、长度运算符、和专用运算符等;运算符必须有运算对象。

按运算对象数目来分:有单目运算符如正号(+)、负号(-)(前

缀单目运算符增(++1)减(--1)、后缀单目运算符增(1++)减(1--))、双目运算符加(+)减(-)乘(*)除(/)、模(%)和三目运算符(只有一个条件运算符(?:))

每个运算符都代表对运算对象的某种运算,都有自己的规则。每

个运算符运算的对象都规定了数据类型。因此把运算符也划分若干种类型

同级别的运算符还规定了结合性,若是自左向右遇谁谁先算的则

结合性称为自左向右的,若是自右向左遇谁谁先算的则结合性称为自右向左的。

运算符有优先级,当有多个运算符时,谁先必须遵守一定的规则。

24

这种执行的先后顺序,称为运算符的优先级,优先级高的先做,优先级低的后做。圆括号能够修改运算的执顺序,其内的运算优先级 各种类型运算符的优先级和结合性 运算符类型 基本 运算符 ()、[]、->。 15 优先级 结合性 自左向右 !、~、++、--、14 单目 +、-、*、&、sizeof 算术 移位 关系 *、/、% +、- <<、>> 13 12 11 自左向右 自左向右 自左向右 自左向右 自右向左 <、<=、>、>= 10 ==、!= & 9 8 7 6 5 4 3 位逻辑 ^ | 自左向右 逻辑 条件 赋值 && || ?: 自左向右 自右向左 自右向左 =、+=、-=、*=、2 25

/=、%=、|=、^=、&=、>>=、<<= 逗号 二、表达式 用运算符将运算对象连接形成的式子称为表达式;从构成表达式的运算符来划分,它们主要包括以下类型表达式: 算术表达式、赋值表达式、关系表达式、逻辑表达式、逗号表达式、条件表达式等,表达式是描述数据加工的一种方法。 C语言中的表达式是由运算对象和运算符组成的,每个表达式都可以按照其中的运算符的优先级别和运算规则依次对运算对象进行运算,最终会有一个值,该值称为表达式的值 表达式值的数据类型就称为表达式的数据类型。由于表达式计算结果可能是整型、实型和逻辑型,故表达式的数据类型也可以分为整型、实型和逻辑型C语言中逻辑型的数据都是用整数来表示的,因此表达式类型实际上只区分为整型和实型合称为数值型,在程序或语句中使用表达式时,要按照语法和表达式的位置来确定表达式的准确类型 C语言表达式中的所有成分都是写在一行上,没有分式,也没有上下标,括号也只用圆括号()({}[]作其它用)如数学公式: , 1 自左向右 a + b a – b

26

应写成(a+b)/ (a-b)其中括号不能省

三、运算符和表达式的应用 1. 算术运算符和表达式

如:设有整型变量a=2,字符型变量c=’a’,单精型实型变量f=3.0,则下列表达式都为算术表达式

a+2-a*6/f+c%a (由常量和变量构成,表达式的值为1.0)

(a<=f)+5 (由常量和关系表达式构成,表达式的值为6)

(!a&&1)*f (由变量和逻辑表达式构成,表达式的值为0.0)

-((a>2)?3:2) (由条件表达式构成,表达式的值为-2)

(a=2)*f (由变量赋值表达式构成,表达式的值为6.0)

(1,2)-a (由变量和逗号表达式构成, 表达式的值为0)

算术运算符优先级规定为:

? 单目基本算术运算符优先于双目基本算术运算符 ? *、/、% 优先于 +、-

? 同级单目基本算术运算符的结合方向是自右向左 ? 同级双目基本算术运算符的结合方向是自左向右

27

2、赋值运算符和表达式

是由赋值运算符或自反赋值运算符连接的表达式具体规则为: (1)变量=表达式

(2)变量=自反赋值运算符 表达式

例:如上述条件则下面的都为赋值运算符和表达式

f*=a+2 (由算术表达式构成,表达式的值为12.0)

d=a<=c (由关系表达式构成,表达式的值为1) d=!(a==0) (由逻辑表达式构成,表达式的值为1) d=(a>0)?2:1 (由条件表达式构成,表达式的值为2) e=f+2.1 (由赋值表达式构成,表达式的值为5.1)

e=(a,c,f,0) (由逗号表达式构成,表达式的值为0.0)

结合方向为自右向左如x=y=5等价于x=(y=5)

若两边的类型不一致,则先将右边的表达式值的类型自动转换成左边变量的类型,然后再赋值见例chang.c 在C语言中允许不同的数据类型进行混合运算,即整型、实型、和字符型数据可以出现在同一个表达式中,但要遵循一定的原则,使运算符两边的操作数具有相同的类型。转换原则是:将运算符两边的数据根据如图原则转换成为它们之中数据较长的数据类型,以保证运算精度不会降低

28

double int 两个原则: 1、垂直降落:若是char型,则必须转为int型、若是float型,则必须先转换成double型,然后再进行下一步的运算; 2、向上位移:将int 型、long型、 double型看成为由低到高的三个台阶,若是相同类型的数据,也即为处于同一层,则系统不进行转换而直接运算,运算的结果类型是该数据类型。若数据类型不同,即处于不同阶层,则系统将其中低级别类型的数据统一到高级别的类型,然后再运算,而且运算结果是高级别类型 3、逗号运算符和表达式 由逗号运算符连接表达式构成的具体的规则如下 表达式1,表达式2 其中的表达式1,表达式2一般是同一类型的表达式见上机例dou.c 如下例题例:条件如上述则下面的都为逗号运算符和表达式 a+2,c+2 (由算术表达式构成,表达式的值为99)

29

long a<=c,f>=c (由关系表达式构成,表达式的值为0) !(a==0),f!=0&&c==’A’ (由逻辑表达式构成,表达式的值为0) (a>0?0:1),(a<0?1:2) (由逻辑表达式构成,表达式的值为2) d=f+2.1,e=a-10 (由逻辑表达式构成,表达式的值为-8.0)

a,c,f,10 (由逻辑表达式构成,表达式的值为10) 逗号运算符的优先级为15,是所有的运算符中最低的运算符,逗号运算符的结合方向为自左向右 4、关系运算符和表达式

用关系运算符将两个表达式连接的式子,具体构成的规则如下: 表达式 关系运算符 表达式

关系运算符有6种,前4种关系运算符的优先级别相同,后两种也相同,前4种高于后两种

关系运算符的优先级低于算术运算符 关系运算符的优先级高于赋值运算符

关系表达式的值是一个值,以1代表“假”,以0代表“真”当关系式成立时,表达式的值为1;当关系式不成立时,表达式的值为0。

如下例题例:条件如上述则下面的都为关系运算符和表达式 a+2!=c-100 f/3<=a-c (由算术表达式构成,表达式的值为1、0)

a<=(f<=c) (a>c)>=(f>4)(由关系表达式构成,表达式的值为0、1)

30

!a==!f (!a&&1)!=(!c||1) (由逻辑表达式构成,表达式的值为1、1)

((a>2)?3:0)<((f!=1)?0:1) (由条件表达式构成,表达式的值为0)

(a=2)<=(f=1) (c=’A’)!=(f=100.5)

(逻辑表达式构成,表达式的值为0、

1)

(1,2)!=(2,1) (1,2,3)==(3,3,3)

(由逗号表达式构成,表达式的值为1、

1)

5、逻辑运算符和表达式

用逻辑运算符将关系表达式或逻辑量连接起来的式子,构成规则

单目逻辑运算符 表达式 表达式 双目逻辑运算符 表达式 逻辑运算符有3种

!的优先级高于&&,&&的优先级高于||

!的优先级高于算术运算符和关系运算符的优先级,而&&和||优先级低于算术运算符和关系运算符的优先级

逻辑表达式的值是一个逻辑值,即“真”与 “假” 以0代表“假”,以1代表“真”

在C语言中,&&和||是短路运算符号,即在一个或多个&&相连的表达式中只要有一个操作数为“0”,就不做后面的&&运算,

31

整个表达式为“0”,而对于一个或多个||相连的表达式中只要第一个操作数不为“0” 就不做后面的||运算,则整个表达式不为“0”

如下例题例:条件如上述则下面的都为逻辑运算符和表达式 a<=c||f<=c (c>a)&&(f>4)

(由关系表达式构成,表达式的值为1、

0)

!(1,2) (1,2,3)&&(3,3,3)

(由逗号表达式构成,表达式的值为0、

1)

6、条件运算符和表达式

用条件运算符连接起来的式子 构成规则 X=表达式1?表达式2:表达式3

其意义为,先求解表达式1,若为非“0”,则求解表达式2,将表达式2的值赋给X,若表达式1的值为“0”,则求解表达式3将表达式3的值赋给X。 如:min=(a

在C语言中,经常使用自加(++)、自减(--)运算符、它的优先级别为2,结合方向为自右向左。

这两个运算符不仅有对运算对象进行“运算”(加1和减1)的作用,还有将运算后的值回存到运算对象的作用。

32

运算符 ++ ++ -- -- 表达式 ++x x++ --y y-- 解释 先将x加1回存,再用X的新值参与表达式运算 先用X的值参与表达式运算,然后加1回存成为X的新值 先将Y减1回存,再用Y的新值参与表达式运算 先用Y的值参与表达式运算,然后减1回存成为Y的新值 33