计算机设计语言(c语言)1_第1页
计算机设计语言(c语言)1_第2页
计算机设计语言(c语言)1_第3页
计算机设计语言(c语言)1_第4页
计算机设计语言(c语言)1_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章第二章 基本基本C语言程序设计语言程序设计案例描述案例描述求任意两个数的和?注意:1、数的类型 2、数的存储 3、运算符号 4、输入两个数 5、输出和C语言提供的数据结构是以语言提供的数据结构是以数据类型数据类型形式出现的。形式出现的。C的数据类型有的数据类型有:数据类型数据类型整型整型字符型字符型 实型实型(浮点型浮点型) 枚举类型枚举类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型单精度型单精度型双精度型双精度型数组类型数组类型结构体类型结构体类型共用体类型共用体类型 1. 数据的描述(数据结构)数据的描述(数据结构)一个程序应包括两个方面的内容一个程序应包括两个方面

2、的内容: 2. 操作的描述(即操作步骤、算法)操作的描述(即操作步骤、算法) 数据是操作的对象,操作的结果又会改变数据的状况。数据是操作的对象,操作的结果又会改变数据的状况。 数据结构与算数据结构与算法的结合才成为一个程序。法的结合才成为一个程序。2.1 C 的数据类型的数据类型C语言的基本符号语言的基本符号1. 基本符号基本符号: 26个英文字母个英文字母 包括包括大写和小写,大写和小写,C 中大小写字母被认为是两个不同的字符。中大小写字母被认为是两个不同的字符。 数字数字 09。 特殊符号:如特殊符号:如 初等量表达式操作符:初等量表达式操作符:( ),), ,. ,; 一元操作符:一元操

3、作符:*,&,-,!,!,+ +,- -,sizeof( ); 二元操作符:二元操作符: , *,%, =,=,=,&=,=,|= ; 逗号操作符:,;逗号操作符:,; 标识符的组成:标识符的组成: 由字母、数字、下划线(由字母、数字、下划线(-)组成,且)组成,且第一个字符必须是字母或下划线第一个字符必须是字母或下划线。 注意:注意:C语言中语言中 大、小写字母被认为是两个不同的字符大、小写字母被认为是两个不同的字符: sum 和和SUM。例例 sum, _total, lotus_1, A1, B123 为合法的标识符。为合法的标识符。而而 M. John, 1A, $3.

4、33 不合法。不合法。2. 标识符标识符 用来表示变量名、符号常量名、函数名、数组名、用来表示变量名、符号常量名、函数名、数组名、类型名、文件名等的字符序列类型名、文件名等的字符序列 。 标识符字符序列长度标识符字符序列长度ANSI C 无规定。无规定。 一般取前一般取前8位,例:位,例: student_number, student_name 不能区分不能区分 stu_number, stu_name 能区分能区分 标识符分类标识符分类:(分分3类类) 关键字:关键字:32个,一般用小写字母。个,一般用小写字母。 typedef, auto, extern, static, regeste

5、r; char, int, short, unsigned, long, float, dobule, union, struct, enum; while, do, for, switch, break, continue, return, goto, if, else, case; void, default 预定义标识符:预定义标识符:如如 printf( ), scanf( ), define, include. 用户定义的标识符用户定义的标识符一般应选用有一定含义的字符串,以便于程序阅读。一般应选用有一定含义的字符串,以便于程序阅读。 选择题选择题:以下选项中,均是不合法的用户标识符

6、是以下选项中,均是不合法的用户标识符是 ( )。A) A B) float C) b-a D) _123 P_0 1a0 go# temp do _A intINT C语言中的数据有常量与变量之分。语言中的数据有常量与变量之分。2.2.1 常量与符号常量常量与符号常量 常量常量在程序运行过程中其值不能被改变的量。在程序运行过程中其值不能被改变的量。 常量有不同的类型常量有不同的类型, 如如 0,-3,4.6,-1.23,a, d, A 分别为不同类型。分别为不同类型。常量一般从其字面形式即可判别类型,这种常量称为常量一般从其字面形式即可判别类型,这种常量称为字面常量或直接常量字面常量或直接常量

7、。 常量也可以用标识符代表常量也可以用标识符代表,称为,称为符号常量符号常量。2.2 常量与变量常量与变量习惯上符号常量名用大写,习惯上符号常量名用大写,变量名用小写,以示区别。变量名用小写,以示区别。使用符号常量的好处是:使用符号常量的好处是:含义清楚。含义清楚。在需要改变一个常量时能在需要改变一个常量时能做到做到“一改全改一改全改”。例例2.1 符号常量的使用符号常量的使用#define PRICE 30main( ) int num=10; total=num*PRICE; num=num+30; p=(p1+p2+PRICE)/3; 2.2.2 变量变量变量变量 其值可以改变的量称为变

8、量。其值可以改变的量称为变量。 一个变量应该一个变量应该有一个名字有一个名字 变量名,用合法的标识符表示变量名,用合法的标识符表示在内存占据一定的存储单元,在该内存单元中存放变量的值。在内存占据一定的存储单元,在该内存单元中存放变量的值。应注意应注意区分变量名和变量值区分变量名和变量值这两个不同的概念:这两个不同的概念:变量名实际上是一个变量名实际上是一个符号地址符号地址,在对程序编译连接时由系统给每一个,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元

9、中读取数据。名找到相应的内存地址,从其存储单元中读取数据。3变量值变量值存储单元存储单元a变量名变量名C语言中,要求对所有用到的变量作强制定义,语言中,要求对所有用到的变量作强制定义,即即先定义后使用先定义后使用, 这样可以这样可以:1.确保程序中变量名的正确。确保程序中变量名的正确。2.一个变量一经定义,在编译时就可以为其一个变量一经定义,在编译时就可以为其分配相应的存储单元。分配相应的存储单元。3.由于每个变量都有一个类型,因此在编译由于每个变量都有一个类型,因此在编译时可以检查该变量所进行的运算是否合法时可以检查该变量所进行的运算是否合法.2.3 整型数据整型数据2.3.1 整型常量的表

10、示法整型常量的表示法 即整常数,即整常数,C语言中有以下三种表示形式语言中有以下三种表示形式:1. 十进制:十进制: 如如 123 0 -4562. 八进制:八进制: 以以0开头的数即认为是八进制数。开头的数即认为是八进制数。 如如 0123 即八进制的即八进制的123, 相当于十进制的相当于十进制的833. 十六进制:十六进制: 以以0 x或或0X开头的数即认为是十六进制数。开头的数即认为是十六进制数。 如如 0 x123 即十六进制的即十六进制的123, 相当于十进制的相当于十进制的291 。 选择题选择题:以下选项中,均是合法的整型常量的选项是以下选项中,均是合法的整型常量的选项是 (

11、)。A) 160 B) -0 xcdf C) -01 D) -0 x48a -0 xffff 01a 986,012 2e5 011 0 xe 0668 0 x2.3.2 整型变量整型变量1. 整型数椐在内存中存放形式整型数椐在内存中存放形式 数椐在内存中是以数椐在内存中是以二进制二进制形式存放的,每一个形式存放的,每一个整型变量整型变量在在32位机器内存中占四个字节位机器内存中占四个字节。2. 整型变量的分类整型变量的分类 可以根据可以根据数值的范围数值的范围 将整型变量定义为三种类型将整型变量定义为三种类型。 基本型基本型: 以以 int 表示。表示。 短整型短整型: 以以 short i

12、nt 或或 short 表示表示 长整型长整型: 以以 long int 或或 long 表示表示归纳起来,可以使用以下归纳起来,可以使用以下6 类整型变量:类整型变量: signed int unsigned int signed short int unsigned short int signed long int unsigned long int 为了充分利用变量的表数范围,可以不设符号位,而用全部二进为了充分利用变量的表数范围,可以不设符号位,而用全部二进位存放位存放 不带符号的整数数据,即定义不带符号的整数数据,即定义无符号型无符号型。因而可以有:无符。因而可以有:无符号整型号整

13、型( unsigned int )、无符号短整型、无符号短整型( unsigned short )、无符号长整、无符号长整型型 ( unsigned long )。注:注:C 标准并没有具体规定以上各类数据所占内存字节数,只要求标准并没有具体规定以上各类数据所占内存字节数,只要求long型数据长度不短于型数据长度不短于int 型,型,short 型不长于型不长于int 型。型。例例2.2 整型变量的定义和使用整型变量的定义和使用 main( ) int a,b,c,d; unsigned int u; a=12; b=-24; u=10; c=a+u; d=b+u; printf(a+u=%d

14、 , b+u=%dn,c,d ); 运行运行结果结果:a+u=22, b+u=-14可以看到:不同种类的整可以看到:不同种类的整型数据可以进行算术运算型数据可以进行算术运算.3. 整型变量的定义整型变量的定义: int a, b; - a, b 定义为整型定义为整型 unsigned short c, d; - c, d 定义为无符号短整型定义为无符号短整型 long e, f; - e, f 定义为长整型定义为长整型 变量定义一般放在函数的开头部分的变量定义一般放在函数的开头部分的声明部分声明部分(但也有例外)。(但也有例外)。 2.4 实型数据实型数据2.4.1 实型常量的表示法实型常量的

15、表示法 C语言中的实数又称语言中的实数又称浮点数浮点数,有两种表示形式,有两种表示形式:1. 十进制数形式:十进制数形式:由数字和小数点组成(必须有小数点)。由数字和小数点组成(必须有小数点)。 如如 0.123 .123 123. 0.0 2. 指数形式指数形式:由数字、字母:由数字、字母E (或或 e ) 和小数点组成,且和小数点组成,且E 后面必须是后面必须是整数,整数,E 前面必须要有数字前面必须要有数字 。 如如 123e3 1.23e6 123.4E2 规范化的指数形式规范化的指数形式:在字母:在字母e 或或E 之前的小数部分中,小数点左边有之前的小数部分中,小数点左边有且只有一位

16、非零数字。且只有一位非零数字。如如 1.23e 选择题选择题:以下选项中,均是不合法的实型常量的选项是以下选项中,均是不合法的实型常量的选项是 ( )。A) 160. B) 123 C) -.18 D) -e3 0.12 2e4.2 123e4 .234 e3 . e5 0.0 1e32.4.2 实型变量实型变量1. 实型数据在内存中的存放形式实型数据在内存中的存放形式 一个实型数据一般在内存中占用四个字节(一个实型数据一般在内存中占用四个字节(32位)位), 按照指数形式存储按照指数形式存储。 例如,例如,3.14159 按照按照 “ +0.314159e1” 形式存储。形式存储。在在4个字

17、节中,究竟用多少位来表示小数部分、多少位来表示指数部个字节中,究竟用多少位来表示小数部分、多少位来表示指数部分,标准分,标准C 并无具体规定,完全由各编译系统自定。小数部分占的位数越并无具体规定,完全由各编译系统自定。小数部分占的位数越多,数的有效数字越多,精度越高。指数部分占的位数越多,则能表示的多,数的有效数字越多,精度越高。指数部分占的位数越多,则能表示的数值范围越大。数值范围越大。 单精度单精度float型(型(32 bit,7位有效数字)位有效数字) 2. 实型变量的分类实型变量的分类 双精度双精度double型(型(64 bit,16位有效数字)位有效数字) 3. 实型变量的定义实

18、型变量的定义: 每个实型变量也必须在使用之前定义每个实型变量也必须在使用之前定义 例如例如 float x,y; -定义定义 x 和和 y 为单精度型变量为单精度型变量 double z; -定义定义 z 为双精度型变量为双精度型变量 单精度与双精度只是数据的有效位数不同单精度与双精度只是数据的有效位数不同.。4. 实型数据的舍入误差实型数据的舍入误差 由于实型变量是由有限的存储单元组成的,因此能提供的有效数由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生误差字总是有限的,在有效位以外的数字将被舍去,由此可能会产生误差(四舍五入)

19、。(四舍五入)。 例例2.4 main( ) float a,b; a=123456.789e5; b=a+20; printf( %f ,b); 运行结果:运行结果: 12345678848. 000000这是因为一个实型变量只能保证这是因为一个实型变量只能保证7位数字有效位数字有效。 注意:应避免将一个很大的数和一个很小的数相加或相减。注意:应避免将一个很大的数和一个很小的数相加或相减。 a:12345678900b:12345678920 ?2.4.3 实型常量的类型实型常量的类型许多许多C 编译系统将实型常量作为编译系统将实型常量作为双精度双精度来处理。来处理。 例:例:float f

20、; f = 2.45678 * 4523.65;系统将系统将2.45678 和和4523.65 按双精度数据存储(占按双精度数据存储(占64位)和运算,得位)和运算,得到一个双精度的乘积,然后取前到一个双精度的乘积,然后取前 7 位赋给实型变量位赋给实型变量f ,这样可保证计算,这样可保证计算结果精确,但运算速度降低。结果精确,但运算速度降低。 若想让编译系统按单精度(若想让编译系统按单精度(float ,32位)处理实型常量,可在数的后位)处理实型常量,可在数的后面面加字母加字母 f 或或F。例:。例: f = 2.45678f * 4523.65f ;一个实型常量可以赋给一个一个实型常量可

21、以赋给一个float型、型、double型变量。型变量。根据变量的类型截取实型常量中相应的有效位数字。根据变量的类型截取实型常量中相应的有效位数字。例例. float a ; a=123456.711 ;(有效位为(有效位为 123456.7)double a;a=123456.711 ;(有效位为(有效位为 123456.711)2.5.1 字符常量字符常量 C的字符常量是指用的字符常量是指用单引号括起来的一个字符,单引号括起来的一个字符, 如如 a, A, $ 等。等。 除上述字符常量之外,除上述字符常量之外,C中还允许一种特殊字符常量,即以中还允许一种特殊字符常量,即以 开头的字开头的字

22、符序列,符序列, 称为称为转义字符转义字符,意思是将,意思是将 “ ” 后面的字符转变成另外的意义后面的字符转变成另外的意义。表示字表示字符符“”表示字表示字符符“t” 2.5 字符型数据字符型数据n 换行换行t 水平制表水平制表(跳到下一个跳到下一个tab位位) (一个一个tab位占位占8列列)v 竖向跳格竖向跳格(相当于换行相当于换行)b 退格,将当前位置移到前一列退格,将当前位置移到前一列r 回车回车(到行首到行首,不换行不换行)f 走纸换页,将当前位置移到下页开头走纸换页,将当前位置移到下页开头 字符字符 “ ” 字符字符 “ ”ddd 13位八进制数所代表的字符位八进制数所代表的字符

23、 如如 074xhh 12位十六进制数所代表的字符位十六进制数所代表的字符 如如 x74 选择题选择题:以下选项中,均是不合法的转义字符的选项是以下选项中,均是不合法的转义字符的选项是 ( )。A) B) 1011 C) 011 D) abc f 101 xf a x1f 选择题选择题:以下选项中,正确的字符常量是以下选项中,正确的字符常量是 ( )。A) c B) C) 085 D) W 2.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法将一个字符常量存到一个字符变量中去,并不是把该字符本身放将一个字符常量存到一个字符变量中去,并不是把该字符本身放入内存

24、单元之中,而是将该入内存单元之中,而是将该字符的相应的字符的相应的ASCII码码存放到存储单元之中。存放到存储单元之中。 例如例如: char c1, c2; c1=a; c2=b; 2.5.2 字符变量字符变量 字符变量用来存放字符常量(字符变量用来存放字符常量(只能放一个字符只能放一个字符,而不是字符串)。,而不是字符串)。 字符变量的定义字符变量的定义: char c1, c2; 定义定义c1,c2为字符变量为字符变量内存中存放的不是字符内存中存放的不是字符a 和和 b,而是而是 a 和和 b 的的ASCII码码 : 0110 0001 (97) 和和 0110 0010 (98) 由于

25、字符数据以由于字符数据以ASCII码存储,与整数有相同的形式,因此码存储,与整数有相同的形式,因此C 语言中语言中的的字符型数据和整型数据字符型数据和整型数据之间可以之间可以通用。通用。 字符数据与整型数据可以互相赋值。一个字符可以以字符形式输出,字符数据与整型数据可以互相赋值。一个字符可以以字符形式输出,也可以以整数形式输出。也可以以整数形式输出。 以字符形式输出时先将以字符形式输出时先将ASCII码转换成相应的字码转换成相应的字符,然后输出;以整数形式输出时,直接以符,然后输出;以整数形式输出时,直接以ASCII码作为整数输出。对字码作为整数输出。对字符数据作算术运算相当于对它们的符数据作

26、算术运算相当于对它们的ASCII码作算术运算。码作算术运算。 例例. char c1, c2;c1=a; 与与 c2=b; 对对c1、c2分别赋值,结果相同。分别赋值,结果相同。 至于是输出字至于是输出字符还是整数取决于符还是整数取决于格式控制符格式控制符。%d:十进制整型:十进制整型%c:字符型:字符型例例 2.6 字符变量和整型变量相互赋值。字符变量和整型变量相互赋值。 main( ) char c1, c2 ; int i; i=a; c1=97 ; c2=98 ; printf( %c %c %cn, i, c1, c2) ; printf(%d %d %dn, i, c1, c2)

27、; char c1, c2;c1=97; c2=98; 运行运行结果:结果: a a b 97 97 98 例例 2.7 大小写字母转换。大小写字母转换。 main( ) char c1 , c2 ; c1=a ; c2=b ; c1=c1-32 ; c2=c2-32 ; printf(%c %c , c1 , c2) ; 从从ASCII码表中可以看到,码表中可以看到,每一个小写字母比它相应的大写每一个小写字母比它相应的大写字母的字母的ASCII大大32。因此有:。因此有:小写字母小写字母32 大写字母大写字母运行运行结果:结果: A B说明说明: 有些系统将字符变量中的最高位作为符号位,将字

28、符处理成带符号有些系统将字符变量中的最高位作为符号位,将字符处理成带符号的整数,亦即的整数,亦即 signed char 型,它的取值范围是型,它的取值范围是 -128127。如果使用如果使用ASCII码为码为0 127 间的字符,由于字节中的最高位为间的字符,由于字节中的最高位为0,因,因此用此用%d 输出时,输出一个正数;输出时,输出一个正数;如果使用如果使用ASCII码为码为128 255 间的字符,由于其在字节中的最高位为间的字符,由于其在字节中的最高位为1,用,用%d 格式输出时,则会输出一个负数。格式输出时,则会输出一个负数。例如例如 char c=130; printf(%d,

29、c); 如果不想按有符号处理,可以将字符变量定义为如果不想按有符号处理,可以将字符变量定义为 unsigned char 类类型,这时其取值范围是型,这时其取值范围是 0 255。 例:例: signed char a ; ( 128 127)unsigned char b ; (0 255)printf(%d,a) ; /* a 的第一位为符号位的第一位为符号位 */ printf(%u,b) ; /* b 的第一位为数值位的第一位为数值位 */0111 1110 (126源码)源码)1000 0001(按位取反)(按位取反)1000 0010 (加(加1,同,同130)结果结果1262.5

30、.4 字符串常量字符串常量 v 字符串常量:字符串常量:是一对是一对双引号双引号 括起来的括起来的字符序列字符序列。如如: How do you do. $123.45v字符串常量与字符常量字符串常量与字符常量: 字符常量是字符常量是一个字符一个字符,字符串常量是一对双引号,字符串常量是一对双引号 括起来的括起来的字符序列。字符序列。C 规定:在每一个字符串的结尾加一个规定:在每一个字符串的结尾加一个“字符串结束标志字符串结束标志”,以便系统椐,以便系统椐此判断字符串是否结束。此判断字符串是否结束。C 规定以字符规定以字符 0 作为字符串结束标志。作为字符串结束标志。 0 是是系统自动加上的,

31、在写字符串时不必加系统自动加上的,在写字符串时不必加 0 。a 与与 a 的区别的区别:字符串:字符串a实际上包含实际上包含2个字符:个字符:a 和和 0,占占2个字节;个字节;a占占1个字节。个字节。注意:注意:不要混淆字符常量与字符串常量不要混淆字符常量与字符串常量!字符串常量不能赋给一个字符变量。字符串常量不能赋给一个字符变量。如如: c=a; 是非法的,而应该是是非法的,而应该是 c=a;v C语言中的语言中的字符串用字符型数组来存放。字符串用字符型数组来存放。 选择题选择题:以下选项中,均是正确的数值常量或字符常量的是以下选项中,均是正确的数值常量或字符常量的是 ( )。A) 0.0

32、B) a C) 3 D) +001 0f 3.9E-205 011 0 xabcd 8.9e 1e1 0 xFF00 2e2 & 0a 50. 选择题选择题:下面不正确的字符串常量是下面不正确的字符串常量是 ( )。A) abcB) 1212 C) 0 D) 2.6 变量赋初值变量赋初值如如 int i=3;float x=2.5;变量赋初值相当于变量定义与变量赋值两部分。变量赋初值相当于变量定义与变量赋值两部分。 如如: int i=3; 相当于相当于 int i; i=3;也可以使被定义的变量的一部分赋初值。也可以使被定义的变量的一部分赋初值。 如如: int a, b, c=5;

33、 (只对只对c 赋初值赋初值5) 如果对几个变量赋以同一个值,不能写成如果对几个变量赋以同一个值,不能写成int a=b=c=3 ; 而应写成而应写成 int a=3,b=3,c=3 ; 注意注意:变量初始化一般是在程序运行、执行本函数时赋予初值的。变量初始化一般是在程序运行、执行本函数时赋予初值的。程序中常常需要对一些变量预先设定初始值,程序中常常需要对一些变量预先设定初始值,C语言中规定,可以语言中规定,可以在在定义变量的同时使变量初始化定义变量的同时使变量初始化。2.7 各数据类型之间的混合运算各数据类型之间的混合运算高高 double -float 即即float必须先转换成必须先转换

34、成double 以提高精度以提高精度(即使两个数同为即使两个数同为float long 型也必须转换为型也必须转换为double后进行运算后进行运算) unsigned 低低 int -char, short 字符、短整型必须转换成整型字符、短整型必须转换成整型int或或 char short int int unsigned int long int float double long double注意:这里只是指出数据类别级别的高低,而不是说必须一级一级转换。注意:这里只是指出数据类别级别的高低,而不是说必须一级一级转换。 例如例如: int 与与 double 运算,则运算,则int 直

35、接转换成直接转换成double,然后运算,而不必,然后运算,而不必经过经过 unsigned 和和 long 这两级。这两级。整型、实型(单精度、双精度)可以混合运算,而字符型数据与整型通用,整型、实型(单精度、双精度)可以混合运算,而字符型数据与整型通用,因此,因此, 整型、实型(单精度、双精度)、字符型数据之间可以混合运算。整型、实型(单精度、双精度)、字符型数据之间可以混合运算。 例如例如: 10+a+12.3*b 是合法的是合法的在在运算时先将各种类型化成同一类型运算时先将各种类型化成同一类型,然后进行运算,然后进行运算, 类型转换的规则是类型转换的规则是:上面的算式上面的算式 10+

36、a+12.3*b 运算时,运算时, 将字符将字符 a 转换成转换成 int 与与10 相加相加; 进行进行12.3* b 运算,先将运算,先将b 转换成转换成 int ,而,而 int 与与 double 运算时,运算时, int 向向 double转换,结果为转换,结果为 double; int 与与 double 相加,先将相加,先将 int 转换成转换成 double,最后结,最后结果是果是 double 型。型。例如例如: int i; float f ; double d ; long e ; 表达式:表达式: 10+a+i*f-d/e运行次序:运行次序: 10+a(int) i*f

37、 (double) 107+i*f(double) d/e(double) 10+a+i*f+d/e(double)2.8 算术运算符和算术表达式算术运算符和算术表达式C的运算符范围很宽,除了控制语句和输入输出以外的几乎所的运算符范围很宽,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。有的基本操作都作为运算符处理。 C运算符有以下几类运算符有以下几类: 1. 算术运算符算术运算符 + , - , * , / , % , + , - 2. 关系运算符关系运算符 , = , = , = , != 3. 逻辑运算符逻辑运算符 ! (逻辑非)(逻辑非), &(逻辑与)(逻辑与

38、) , |(逻辑或)(逻辑或) 4. 位运算符位运算符 &(位与位与), |(或或), (异或异或), (取反取反), (右移右移) 5. 赋值运算符赋值运算符 = 及其扩展赋值运算符及其扩展赋值运算符(如如 +=, -=, .) 6. 条件运算符条件运算符 (1) ? (2) : (3) ( 如果如果(1)为真为真,则取则取(2),否则取否则取(3) ) 7. 逗号运算符逗号运算符 , 8. 指针运算符指针运算符 * , & 9. 求字节运算符求字节运算符 sizeof( ) 10. 强制类型转换运算符强制类型转换运算符 (类型类型) 11. 分量运算符分量运算符 . , -

39、 12. 下标运算符下标运算符 13. 其它其它 (如函数调用运算符如函数调用运算符( ) 等等)2.8.1 C 运算符简介运算符简介2.8.2 算术运算符和算术表达式算术运算符和算术表达式1. 基本算术运算符基本算术运算符 分两类:分两类:一元运算符一元运算符 : 、 、 ; 例如例如 -x , x+ , x- 二元运算符:二元运算符: 、 * 、%(模运算符,求余运算符);(模运算符,求余运算符);注意两点:注意两点: 两个整数相除,结果为整型两个整数相除,结果为整型,舍去小数部分。,舍去小数部分。如果其中一个为实型,如果其中一个为实型,则结果为则结果为double。如果其中之一为负数,则

40、舍入的方向是不定的,依机器。如果其中之一为负数,则舍入的方向是不定的,依机器而定。多数机器采取而定。多数机器采取“向零取整向零取整”。如如 5/3 =1 , 3/5=0, -5/3=-1 % 运算符只适用于整数运算符只适用于整数。 5%3=2 , 3%5=3 , 8%4=0 -7%4=-3 , 7%(-4)=3注意:注意:求模运算中求模运算中 结果值的符号与第一个数(即被求模的数)符号相同结果值的符号与第一个数(即被求模的数)符号相同.例如例如: x+y ; x-y ; x*y ; x/y ; x%y (表示两个整数求余数表示两个整数求余数 , 如如 7%4 的值为的值为 3)C的算术表达式的

41、算术表达式: 用算术运算符和括号将运算对象连接起来的、符合用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子。语法规则的式子。 这里运算对象包括:常量、变量、函数等。这里运算对象包括:常量、变量、函数等。 如如: a*b/c+1+12.3*a 是一个合法的算术表达式是一个合法的算术表达式为了使算术表达式能按正确的法则运算,为了使算术表达式能按正确的法则运算,C规定了运算符的优先级规定了运算符的优先级和结合性:在表达式和结合性:在表达式 求值时,先按求值时,先按 运算符的优先级别高低次序运算符的优先级别高低次序 执执行,行,如果优先级相同,再按如果优先级相同,再按 结合方向结合方向 处

42、理处理。优先级:优先级: - , + , - * , / ,% + , -算术运算符的结合方向(结合性)是算术运算符的结合方向(结合性)是 自左至右自左至右 如如: a-b*c - 与与 * 之间先之间先 * 后后 - a-b+c - 与与 + 同级,则先同级,则先 - 后后 + 如果一个运算符两边的数据类型不同,则按前面的法则进行转换,如果一个运算符两边的数据类型不同,则按前面的法则进行转换,然后运算。然后运算。2. 算术表达式算术表达式 和和 运算符的优先级与结合性运算符的优先级与结合性3. 强制类型转换强制类型转换 可以用一个强制类型转换运算符将一个表达式的值转换成需要的类型。可以用一个

43、强制类型转换运算符将一个表达式的值转换成需要的类型。 一般形式一般形式: (类型名类型名) (表达式表达式) 因此有两种方法进行类型转换因此有两种方法进行类型转换: (1) 自动转换自动转换 (按级别高低)(按级别高低) (2) 强制转换强制转换 (用强制类型转换运算符)(用强制类型转换运算符)例例3.8 强制类型转换。强制类型转换。 1) main( ) float x ; int i; x=5.8 ; i=(int) x ; printf(x=%f , i=%d,x, i) ; 运行结果:运行结果: x=5.800000 , i=5如如: (double) a 将将a 的值转换成的值转换成

44、double型型 (int) (x+y) 将将(x+y)的值转换成的值转换成int 型型 比较比较 与与(int) x+y 有何不同有何不同? (float) (5%3) 注意:强制类型转换只是将表达式的值转换成所需的类型,而原来的变注意:强制类型转换只是将表达式的值转换成所需的类型,而原来的变量类型并没有变化。量类型并没有变化。3) main( ) float x ; int i , j ; x=3.6 ; i=3 ; j=(int)x%i ; printf(j=%d,j); 2) main( ) int x , y ; long z ; x=400 ; y=200 ; z=(long)x*

45、y ; printf(%ldn,z) ; 强制类型转换运强制类型转换运算优先于算优先于%运算运算运行结果:运行结果: j=0运行结果:运行结果: z=800004. 自增运算符(自增运算符( +) 、自减运算符(、自减运算符(- -)自增、自减的作用是使变量的值自动自增、自减的作用是使变量的值自动 增增1、减、减1。+i 、 - -i :在使用:在使用 i 之前使之前使i 的值先增加的值先增加1(或减少(或减少1)。)。 即先变化即先变化 i 得到新值,再使用该新得到新值,再使用该新 i值值 进行运算。进行运算。 i+ 、 i- -:在使用:在使用 i 之后再使之后再使 i 的值增加的值增加1

46、(或减少(或减少1)。)。 即先使用原来的即先使用原来的 i 进行运算,再变化原来的进行运算,再变化原来的 i得到新得到新 i值。值。例如:例如: n=3; n=3 ; m=n+ ; m=+n ; 结果是结果是 m 为为 3 , n 为为 4 ; m为为 4 , n 为为 4注意注意: 自增、自减运算符自增、自减运算符只能用于变量,不能用于常量或表达式。只能用于变量,不能用于常量或表达式。 自增、自减运算符是自增、自减运算符是自右至左结合的自右至左结合的(不同于算术运算符)。(不同于算术运算符)。如如: -i+ 表示表示 (i+),而不是,而不是 (-i)+ , 而而(-i)+也是不合法的。也

47、是不合法的。若若 i=3;printf(%d, -i+); 先取出先取出i 的值的值3 ,输出,输出-i 的的值值-3,然后,然后i 增值为增值为4。 自增(减)运算符常用于循环语句中,使循环变量自动加自增(减)运算符常用于循环语句中,使循环变量自动加1(或减或减1),也用于指针变量,使指针指向下一个地址。),也用于指针变量,使指针指向下一个地址。5. 有关表达式使用中的问题有关表达式使用中的问题 C 运算符和表达式使用灵活,应避免出现歧义。运算符和表达式使用灵活,应避免出现歧义。ANSI C 并没有具体规定表达式中的子表达式的求值顺序,允许各并没有具体规定表达式中的子表达式的求值顺序,允许各

48、编译系统自己安排。编译系统自己安排。例如,对表达式:例如,对表达式:a=f1( )+f2( );并不是所有的编译系统都是先调用;并不是所有的编译系统都是先调用f1( ) ,然后调用,然后调用f2( )。在一般情况下,先调用。在一般情况下,先调用f1( ) 和先调用和先调用f2( ) 的结果的结果可能是相同的,但是有的情况下却截然不同。可能是相同的,但是有的情况下却截然不同。如果有表达式如果有表达式: (i+)+(i+)+(i+) 其值是多少呢?(设其值是多少呢?(设i 原值为原值为3)有的系统按照自左而右的顺序求解括弧内的运算,求完第一个括弧有的系统按照自左而右的顺序求解括弧内的运算,求完第一

49、个括弧求第二个括弧,结果为求第二个括弧,结果为3+4+5,即,即12;而另一些系统(如;而另一些系统(如Turbo C )则)则将表达式中的所有将表达式中的所有i 值视为值视为3 相加,即相加,即3个个3 相加得相加得9,然后再实现自加,然后再实现自加3 次,次,i 的值变为的值变为6。运算符的组合。运算符的组合。C语言中运算符有的为一个字符,有的为两个字符,在表达式中如语言中运算符有的为一个字符,有的为两个字符,在表达式中如何组合呢?何组合呢?C 编译系统在处理时编译系统在处理时尽可能多地(自左而右)将若干个字尽可能多地(自左而右)将若干个字符组合成一个运算符符组合成一个运算符 (在处理标识

50、符、关键字时也按同一原则处理在处理标识符、关键字时也按同一原则处理)。如如 i + + + j应理解为应理解为 (i+)+j,而不是,而不是 i+(+j) 函数调用时,参数的调用顺序函数调用时,参数的调用顺序函数调用时,实参数的调用顺序函数调用时,实参数的调用顺序C 标准无统一规定,不同系统可导标准无统一规定,不同系统可导致不同结果。致不同结果。如如 i 的初值为的初值为3,函数调用:,函数调用: printf(%d,%d, i, i+);有的系统从左至右求值,输出有的系统从左至右求值,输出“3,3”;在多数系统中对函数参数;在多数系统中对函数参数的求值顺序是自右而左的,先求第二个表达式的求值

51、顺序是自右而左的,先求第二个表达式i+ 的值,再求第一个表的值,再求第一个表达式达式i 的值,故输出的值,故输出“4,3”。注意:注意:(1) 自增、自减运算,防止副作用;自增、自减运算,防止副作用;(2) 尽量书写简捷易读的表达式尽量书写简捷易读的表达式!为了避免误解,最好写成大家都能理解的形式。为了避免误解,最好写成大家都能理解的形式。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式1. 赋值运算符赋值运算符 赋值号赋值号 “=” 就是赋值运算符。它的作用是将一个数据就是赋值运算符。它的作用是将一个数据赋给一个变量,赋给一个变量, 也可以将一个表达式的值赋给一个变量。也可以将一个表达式

52、的值赋给一个变量。如如: x=1 ; c=a+b;2. 类型转换类型转换 当赋值号两边类型不一致,但都是数值型或字符型时,当赋值号两边类型不一致,但都是数值型或字符型时,赋值时要进行类型转换。赋值时要进行类型转换。不同类型的整型数据间的赋值归根到底就是一条:按存不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。储单元中的存储形式直接传送。注:本部分(书注:本部分(书p59-62)自学。)自学。例:例: *=: a*=3 ; a=a*3 ; /=:x/=y+3 ; x=x/(y+3);%=:a%=3 ; a=a%3 ;在赋值运算符之前加上其它运算符可以构成复合运算符。在

53、赋值运算符之前加上其它运算符可以构成复合运算符。 如如: 在在 = 之前加上之前加上 +, 则构成则构成 +=。 a+=3 相当于相当于 a=a+3 含义是含义是: a+=表达式表达式 相当于相当于 a=a+表达式表达式 如果表达式是由多项构成,则相当于有括号,即如果表达式是由多项构成,则相当于有括号,即 a=a+(表达式表达式) 凡是二元(二目)运算符都可以与凡是二元(二目)运算符都可以与 “ = ” 一起组成赋值运算。一起组成赋值运算。 C 语言中规定可以用语言中规定可以用10 种复合赋值运算符种复合赋值运算符:+= -= *= /= %= = &= = |=3. 复合的赋值运算符

54、复合的赋值运算符v什么是什么是 赋值表达式赋值表达式 ?由(单一或复合)赋值运算符将一个变量和一个?由(单一或复合)赋值运算符将一个变量和一个表达式连接起来的式子。表达式连接起来的式子。v一般形式一般形式: v 赋值表达式的求解过程是赋值表达式的求解过程是:先对运算符右侧的表达式求值,再将该值赋给运算符左边的变量。先对运算符右侧的表达式求值,再将该值赋给运算符左边的变量。v赋值表达式的值:赋值表达式的值:就是被赋值的变量的值。就是被赋值的变量的值。 如如: a=5 的值是的值是5。v这里这里既可以是一个普通的表达式,也可以是一个赋值表达式。既可以是一个普通的表达式,也可以是一个赋值表达式。 如

55、如: a=(b=5) 即表示即表示 b=5 和和 a=5由于赋值运算符是由于赋值运算符是自右至左结合自右至左结合,因此,因此 a=(b=5) 等价于等价于 a=b=5 例:例: a=(b=4)+(c=6)c=6 , b=4 , a=10a=(b=10)/ (c=2)c=2 , b=10 , a=5例:例: 有表达式有表达式 a+=a-=a*a ,设,设 a=12,求,求 运行结果。运行结果。 (1) a-=a*a ,即,即a=a-a*a=-132 (2) a+=a ,即,即a=a+a=-264注意注意:如果在赋值表达式后面加上如果在赋值表达式后面加上 “ ; ” ,则成为赋值语句。,则成为赋值

56、语句。4. 赋值表达式赋值表达式2.10 逗号运算符和逗号表达式逗号运算符和逗号表达式用用 “ , ” 将两个表达式连接起来所构成的表达式称为逗号表达式。将两个表达式连接起来所构成的表达式称为逗号表达式。 如如: 3+5 , 6+8 逗号表达式的一般形式逗号表达式的一般形式: 表达式表达式1 , 表达式表达式2求解过程求解过程: 先求表达式先求表达式1的值,再求表达式的值,再求表达式2的值,的值,整个表达式的值是整个表达式的值是表达式表达式2 的值。的值。 如上式,结果是如上式,结果是14 又如:又如: a=3*5,a*4 结果是结果是a= 15, 表达式值是表达式值是60。一个逗号表达式可以

57、与另一个逗号表达式组成新的逗号表达式。一个逗号表达式可以与另一个逗号表达式组成新的逗号表达式。 如:如: (a=3*5,a* 4) , a+5 即:即: (1) a=15 (2) ( 15 , 60) = 值为值为 60 (3) 60 ,20 = 整个表达式的值为整个表达式的值为 20 例:例: (1) x=(a=3,6*a) (2) x=a=3,6*a赋值表达式:赋值表达式:a为为 3 ,x 为为18 ;逗号表达式:逗号表达式:x为为 3,a为为 3。 逗号表达式可以推广到多个表达式的情况逗号表达式可以推广到多个表达式的情况 表达式表达式1 , 表达式表达式2, . , 表达式表达式n 它的

58、值是它的值是 表达式表达式n 的值。的值。 由于由于逗号运算符是所有运算符中级别最低的逗号运算符是所有运算符中级别最低的,因此书写表达式时要注,因此书写表达式时要注意求解的次序。意求解的次序。 注意:并非所有的注意:并非所有的 , 都是运算符都是运算符 如如: printf(%d,%d,%d,a,b,c); -这里的这里的, 都只是分隔符都只是分隔符 而而 printf(%d,%d,%d, (a,b,c), b, c); -这里这里(a,b,c)中的中的,是运算符是运算符 选择题选择题:下面符合下面符合C 语言语法的赋值表达式是语言语法的赋值表达式是 ( )。A) d=9+e+f=d+9B)

59、d=9+e, f=d+9 C) d=(9+e, e+, d+9) D) d=9+e+=d+7 本章要点本章要点 C语言的标识符是如何定义的。语言的标识符是如何定义的。 C语言有哪些基本数据类型?语言有哪些基本数据类型?各种基本数据类型的常量和变量是如何定义的?各种基本数据类型的常量和变量是如何定义的? C语言有几种类型的表达式?语言有几种类型的表达式? 各种类型表达式是如何求值的?各种类型表达式是如何求值的? 在在C语言混合运算的表达式中,各种运算符的优先级语言混合运算的表达式中,各种运算符的优先级和结合性。和结合性。习习 题题 二二1. 把以下数从小到大排列:把以下数从小到大排列: 256, 0256, 0 x256, -315, 15, 752. 以下各标识符中,哪些合法的标识符用户可以用:以下各标识符中,哪些合法的标识符用户可以用: Pad, scanf, a*, P#D, a10, max, temp, a-b, _isw, float, INT, del_word, line10.3. 写出下面程序段的输出写出下面程序段的输出结果是什么?结果是什么?int k=-1 ;printf(%d,%un

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论