第3章 数据类型、运算符与表达式_第1页
第3章 数据类型、运算符与表达式_第2页
第3章 数据类型、运算符与表达式_第3页
第3章 数据类型、运算符与表达式_第4页
第3章 数据类型、运算符与表达式_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式 清华大学 自动化系 刘连臣 2021年6月24日 C语言程序设计与训练语言程序设计与训练 1 主要内容 o目标:掌握数据的描述规则描述规则(数据类型)和数据 的操作规则操作规则(运算符与表达式)。 o提纲 3.13.1、C C语言的数据类型语言的数据类型 3.23.2、常量与变量、常量与变量 3.33.3、整型数据、整型数据 3.43.4、浮点型数据、浮点型数据 3.53.5、字符型数据、字符型数据 3.63.6、变量赋初值、变量赋初值 3.73.7、各类数值型数据间的混合运算、各类数值型数据间的混合运算 3.83.8、算术运算符

2、和算术表达式、算术运算符和算术表达式 3.93.9、赋值运算符和赋值表达式、赋值运算符和赋值表达式 3.103.10、逗号运算符和逗号表达式、逗号运算符和逗号表达式 2 n 计算机中数的表示及进制转换 o 数码、基与权 n 数码:表示数的符号 n 基:数码的个数 n 权:每一位所具有的值 o 数制 3.0 预备知识 3 o 各种进制之间的转换 n 二进制、八进制、十六进制转换成十进制 方法:按权相加 10 012345 2 59212120212121111011)()(例 10 012 8 94868381136)()(例 10 0123 16 79781610162161516121)()

3、(例AF 3.0 预备知识 4 o 各种进制之间的转换(整数) n 二进制、八进制、十六进制转换成十进制 方法:按权相加 n 十进制转换成二进制、八进制、十六进制 原理: 的余数是 2 )2.22(2 22.22 ).( 0 0 0 1 2 1 1 0 0 1 1 1 1 2011 N a aaaa aaaa aaaaN n n n n n n n n nn 方法:连续除以基,从低到高记录余数,直至商为0 例 把十进制数59转换成二进制数 592 292 142 72 32 12 0 (59)10=(111011)2 1 1 0 1 1 1 1 1 1 0 1 1 余 余 余 余 余 余 例

4、把十进制数159转换成八进制数 1598 198 28 0 (159)10=(237)8 2 3 7 余 7 余 3 余 2 例 把十进制数459转换成十六进制数 45916 2816 116 0 (459)10=(1CB)16 1 C B 余11 余12 余 1 5 n 二进制与八进制之间的转换 二进制转换成八进制:从右向左,每3位一组(不足3位左 补0),转换成八进制 八进制转换成二进制:用3位二进制数代替每一位八进制 数 例 (1101001)2=(001,101,001)2=(151)8 例 (246)8=(010,100,110)2=(10100110)2 000 0 001 1 0

5、10 2 011 3 100 4 101 5 110 6 111 7 3.0 预备知识 6 n 二进制与十六进制之间的转换 二进制转换成十六进制:从右向左,每4位一组 (不足4位左补0),转换成十六进制 十六进制转换成二进制:用4位二进制数代替每一 位十六进制数 例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16 例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8

6、1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F 3.0 预备知识 7 n 字节和位 o 内存以字节为单元组成 o 每个字节有一个地址 o 一个字节一般由8个二进制位组成 o 每个二进位的值是0或1 01234567 0 1 2 3 4 5 6 7 8 9 10 . 7 6 4 3 2 5 1 3.0 预备知识 8 n数值的表示方法原码、反码和补码 o 原码:最高位为符号位,其余各位为数值本身的绝对值 o 反码: n正数:反码与原码相同 n负数:符号位为1,其余位对原码取反 o 补码: n正数:原码、反码、补码相同 n负数:最高位为1,其余位为原

7、码取反,再对整个数加1 3 12 6 9 1 2 4 5 7 8 10 11 9-5=4 9+7=16=(14)12 3.0 预备知识 9 原码反码补码 +7000001110000011100000111 -7100001111111100011111001 +0000000000000000000000000 -0100000001111111100000000 数的范围 01111111 11111111 (-127+127) 01111111 10000000 (-127+127) 01111111 10000000 (-128+127) (用一字节表示数)(用一字节表示数) o 负数

8、补码转换成十进制数:最高位不动,其余位取反加1 例 补码:11111001 取反:10000110 加1: 10000111=-7 3.0 预备知识 10 3.1 C语言的数据类型 o 计算机算法处理的对象是数据 o 数据是以某种特定的形式存在的 o 数据结构是(有一定关系的)数据的组织形式 o 数据分为常量与变量两大类 o 数据必须指定数据类型 11 3.1 C语言的数据类型 o C语言提供了以下一些数据类型语言提供了以下一些数据类型 12 3.2 常量与变量 3.2.1 常量和符号常量常量和符号常量 o 在程序运行过程中,其值不能被改变的量称为常量 o 常量区分为不同的类型: 整型 100

9、,125,-100,0 实型 3.14 , 0.125,-3.789 字符型 a, b,2 字符串 “a”, “ab”,”1232” 字面常量字面常量 或 直接常量直接常量 符号常量符号常量 用一个标识符代表一个常量的符号 #define命令来定义 一般用大写字母,含义清楚,容易修改 13 例3.1 符号常量的使用 #define PRICE 30#define PRICE 30 #include #include void main ( )void main ( ) int num, total; int num, total; num=10; num=10; total=num total

10、=num * * PRICE; PRICE; printf(total=%dn,total); printf(total=%dn,total); 运行结果:运行结果: total=300total=300 程序中用#define命令行定义PRICE代表常量30,此后凡在本文件 中出现的PRICE都代表30,可以和常量一样进行运算 如再用赋值语句给PRICE赋值是错的 PRICE=40; /* 错误,不能给符号常量赋值 3.2 常量与变量 14 3.2 常量与变量 3.2.2变量变量 o变量代表内存中具有特定属性的一个存储单元,它用来存放数 据,这就是变量的值,在程序运行期间,这些值是可以改变的

11、。 o变量名实际上是一个以一个名字对应代表一个地址,在对程序 编译连接时由编译系统给每一个变量名分配对应的内存地址。 从变量中取值,实际上是通过变量名找到相应的内存地址,从 该存储单元中读取数据。 o 变量名与变量值的区别变量名与变量值的区别 15 3.2 常量与变量 变量命名的规定:变量命名的规定:语言规定标识符只能由字母、 数字和下划线三种字符组成,且第一个字符 必须为字母或下划线。 例:例:sum,_total, month, Student_name lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab 16 3.2 常量与变量 o编译系统将

12、大写字母和小写字母认为是两个不同的字符。 o建议变量名的长度最好不要超过8个字符。 o在选择变量名和其它标识符时,应注意做到“见名知意”,即 选有含意的英文单词 (或其缩写)作标识符。 o要求对所有用到的变量作强制定义,也就是“先定义,后使 用” 。 n保证名称正确、便于分配存储空间、检查运算的合法性 17 3.3 整型数据 3.3.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式表示: (1)(1)十进制整数。十进制整数。 如:如:123, -456.4123, -456.4。 可以记作:可以记作:(123)(123)1010, (-456.4)(-

13、456.4)1010 (2)(2)八进制整数。以八进制整数。以0 0开头的数是八进制数。开头的数是八进制数。 如:如:01230123表示八进制数表示八进制数123123,等于十进制数,等于十进制数83,-01183,-011表示八进制数表示八进制数-11,-11,即十进即十进 制数制数-9-9。可以记作:。可以记作: (123)(123)8 8, (-11)(-11)8 8 (3)(3)十六进制整数。以十六进制整数。以0 x0 x开头的数是开头的数是1616进制数。进制数。 如:如:0 x1230 x123,代表,代表1616进制数进制数123,123,等于十进制数等于十进制数 291291

14、。 -0 x12-0 x12等于十进制数等于十进制数 1818。 可以记作:可以记作: (123)(123)1616, (-12)(-12)1616 18 3.3 整型数据 3.3.2 整型变量整型变量 (1 1)整型数据在内存中的存放形式)整型数据在内存中的存放形式 n数据在内存中是以二进制形式存放的。数据在内存中是以二进制形式存放的。 n数值是以补码数值是以补码(complement) (complement) 表示的表示的 如如: : int i; /* 定义为整型变量 */ i=10; /* 给i赋以整数10 */ VC+ 6.0则分配4个字节存储int整数(32位系统) 0 0 0

15、0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 i=-10; /* 给给i赋以整数赋以整数-10 */ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 19 3.3 整型数据 (2 2)整型变量的分类)整型变量的分类 共六种共六种 有符号基本整型 有符号短整型 有符号长整型 无符号基本整型 无符号短整型 无符号长整型 (s

16、igned)int (signed)short (int ) (signed) long (int) unsigned int unsigned short (int) unsigned long (int) 注意:注意:括号表示其中的内容是可选的. 20 3.3 整型数据 整数类型的有关数据:整数类型的有关数据: 注意:注意:VC6.0VC6.0环境下的整数类型环境下的整数类型. 21 3.3 整型数据 基本型(int)的最大值 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

17、0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 基本型(int)的最小值 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 无符号基本型(unsigned int)的最大值 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 无符号基本型(unsigned int)的最小值 22 3.3 整型数据 (3)(3)整型变量的定义整型变量的定义: : 规定在程序中所有用到的变量都必须在程序中定义, 即“强

18、制类型定义强制类型定义”。 例如例如: : int a,bint a,b(指定变量、为整型) unsigned short c,d;unsigned short c,d;(指定变量、为无符号短整型) long e,f;long e,f;(指定变量、为长整型) 23 3.3 整型数据 例3.2 整型变量的定义与使用 #include #include void main()() int a,b,c,d; /*指定、为整型变量指定、为整型变量* unsigned ; *指定为无符号整型变量指定为无符号整型变量* 12;-24;10; ; printf(,);,); 可以看到不同种类的整型数据可以进

19、行算术运算 运行结果:运行结果: , 24 3.3 整型数据 例3.3 整型数据的溢出 #include #include void main()void main() int a,b; int a,b; a= a=2147483647; ; b=a+1; b=a+1; printf(“%d,%dn”,a,b); printf(“%d,%dn”,a,b); 数值是以补码表示的。一个整型变量只能容纳 范围内的数,无法表示大于 或小于的数。遇此情况就发生“溢出”。 运行结果:运行结果: 2147483647,-21474836482147483647,-2147483648 25 3.3 整型数据

20、 3.3.3 整型常量的类型整型常量的类型 (1)(1) VC+6.0VC+6.0中的整数中的整数(int)(int),在,在-2147483648-2147483648+2147483647+2147483647范围内范围内 (2) (2) 一个整常量后面加一个字母一个整常量后面加一个字母u u或或U U,认为是,认为是unsigned intunsigned int型型 如如i=12345ui=12345u,在内存中按,在内存中按unsigned intunsigned int规定的方式存放规定的方式存放 如写成如写成 i=i=-12345u-12345u,则,则先转换成其补码先转换成其补

21、码,然后按无符号数存储。,然后按无符号数存储。 (3) (3) 在一个整常量后面加一个字母在一个整常量后面加一个字母l l或或L L,则认为是,则认为是long intlong int型常量。型常量。 例如:例如: 123l,432L,0L123l,432L,0L 用于函数调用中。如果函数的形参为用于函数调用中。如果函数的形参为long intlong int型,则要求实参也型,则要求实参也 为为long intlong int型。型。 26 3.4 浮点型数据 3.4.13.4.1浮点型常量的表示方法浮点型常量的表示方法 两种表两种表 示形式示形式 小数小数 指数指数 0.1230.123

22、3 3e-3e-3 注意注意: :字母e(或E)之前必须有数字,且e后面的指数必须为整数 27 3.4 浮点型数据 规范化的指数形式:规范化的指数形式: 在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有应有一位(且只能有 一位)一位)非零的数字. 例如例如: : 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e 其中的1.23456e31.23456e3称为“规范化的指数形式规范化的指数形式”。(教材P27) 28 3.4 浮点型数据 3.4.2 浮点型变量浮点型

23、变量 (1)(1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 n一个浮点型数据一般在内存中占4个字节(32位)。 n与整型数据的存储方式不同,浮点型数据是按照指数形式 存储的。 n系统把一个浮点型数据分成小数部分和指数部分,分别存 放。指数部分采用“标准化的指数形式标准化的指数形式”。(教材P19) n 常用的浮点数存储格式:常用的浮点数存储格式:32-bit IEEE-754 floating-point format 29 3.4 浮点型数据 o 32-bit IEEE-754 floating-point format o 对于大小为32-bit的浮点数(32-bit为单精

24、度) 1. 其第其第31 bit为符号位,为为符号位,为0则表示正数,反之为复数,其读数则表示正数,反之为复数,其读数 值用值用s表示;表示; 2. 第第3023 bit为幂数,其读数值用为幂数,其读数值用e表示;表示;(e+127后的e) 3. 第第220 bit共共23 bit作为系数,视为二进制纯小数,假定作为系数,视为二进制纯小数,假定 该小数的十进制值为该小数的十进制值为x; (x为小数点后的部分) S e x 30 3.4 浮点型数据 o32-bit IEEE-754 floating-point format o十进制转浮点数的计算方法: 1. 如果十进制为正,则如果十进制为正,

25、则s = 0,否则,否则s = 1; 2. 将十进制数表示成二进制,然后将小数点向左移动,直到将十进制数表示成二进制,然后将小数点向左移动,直到 这个数变为这个数变为1.x的形式即尾数,移动的个数即位指数。的形式即尾数,移动的个数即位指数。 3. 为了保证指数为正,将移动的个数都加上为了保证指数为正,将移动的个数都加上127,由于尾数,由于尾数 的整数位始终为的整数位始终为1,故舍去不做记忆。(为了处理负指数、,故舍去不做记忆。(为了处理负指数、 以及节约以及节约1比特而特殊规定)比特而特殊规定) 31 3.4 浮点型数据 o例如:对3.141592654来说, 1.正数,s = 0; 2.3

26、.141592654的二进制形式为正数部分计算方法是除以二取整,即 得11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1; 3.将小数点向左移一位,那么它就变为1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,e = 128 = 1000 0000; 4.舍掉尾数的整数部分1,尾数写成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6 5.最后它的浮

27、点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 01 即即 0100 0000 0100 1001 0000 1111 1101 1010 = 40490FDA 32 3.4 浮点型数据 o则按照规定,浮点数的值用十进制表示为: o (-1)s * (1 + x)2 * 2(e-127) o例如:49E48E68 表示多少? n(0100 1001 1110 0100 1000 1110 0110 1000)? 1.其第31 bit为0,即s = 0 2.第3023 bit依次为100 1001 1,读成十进制就是147,即e = 147。 3.第

28、220 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数 0.110 0100 1000 1110 0110 1000 2538598632810.78559589 x 2538598632810.78559589 )(2 / 1000) 0110 1110 1000 0100 (0110 )(2 / )2 *) 1000 0110 1110 1000 0100 (0.110 : 23 2 2323 2 即 小数部分的十进制形式 1872333 2*) 2538598632810.78559589 1 (*) 1( 2*x1*(-1) : )12714

29、7(0 )127( 2 s e )( 式整个浮点数的十进制形 33 3.4 浮点型数据 (2) (2) 浮点型变量的分类浮点型变量的分类 浮点型变量分为单精度(float型)、双精度(double型)和 长双精度型(long double)三类形式。 注意:注意:VC6.0VC6.0环境下的实数类型环境下的实数类型. 34 3.4 浮点型数据 oC/C+中浮点数的表示遵循IEEE 754标准. o浮点数由三部分组成:符号位符号位S.指数部分指数部分E(阶码阶码)以及尾数部分以及尾数部分X. Floating S-E-X 1位位-8位位-23位位 Double S-E-X 1位位-11位位-52

30、位位 十进制数的换算计算公式为十进制数的换算计算公式为: o浮点数的精度取决于尾数部分.尾数部分的位数越多.能够表示的有效数 字越多. o浮点数的绝对值取决于指数部分.指数部分的位数越多.能够表示的数值 范围就越大. )127( 2 s 2*x1*(-1) e )( 35 3.4 浮点型数据 o 单精度数的尾数用23位存储.加上默认的小数点前的1位1. n(1111 1111 1111 1111 1111 1111)2=2(23+1) -1= 16777215. 因为 107 16777215 108. n所以说单精度浮点数的有效位数是单精度浮点数的有效位数是7位位. o 双精度的尾数用52位

31、存储.加上默认的小数点前的1位1. n(1 1111 1111 1111 1111 1111 1111)2=2(52+1)- 1= 9007199254740991.因为1016 9007199254740991 1017. n所以双精度的有效位数是双精度的有效位数是16位位. 36 3.4 浮点型数据 o 单精度数的尾数用23位存储.指数为8位。 (-1)s * (1 + x)2 * 2(e-127) n存储指數值的大小從存储指數值的大小從1254(0和和255是特殊值)。去掉是特殊值)。去掉127后,后, 單精度的指數部分是單精度的指數部分是126+127 n正数最大值:首位为0,指数12

32、7,尾数全为1. 即 2127*2=2128 n正数最小值:首位为0,指数-126,尾数最后为1. 即 2(-126)*2(-23) = 2(-149) n0的规定:首位为0,指数全为0,尾数全为0 n正无穷的规定:首位为0,指数全为1,尾数全为1 n负无穷的规定:首位为1,指数全为1,尾数全为1 n负数最大值:首位为1,指数-126,尾数最后为1.即 - 2(-149) n负数最小值:首位为1,指数127,尾数全为1 . 即 - 2128 37 3.4 浮点型数据 o 注意 n单精度浮点数的有效位数是单精度浮点数的有效位数是7位,双精度的有效位数是位,双精度的有效位数是16位位 n存在舍入误

33、差存在舍入误差 例3.4 浮点型数据的舍入误差 #include #include void main()void main() float a,b;float a,b; a = 123456.789e5; a = 123456.789e5; b = a + 20 ; b = a + 20 ; printf(“%fn”,b); printf(“%fn”,b); 一个浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的, 并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相 减,否则就会“丢失”小的数 运行结果:运行结果: 123456.789e5123456.789

34、e5 38 3.4 浮点型数据 3.4.3 浮点型常量的类型浮点型常量的类型 C编译系统将浮点型常量作为双精度来处理。 例如例如:f = 2.45678 * 4523.65 系统先把2.45678和4523.65作为双精度数,然后进 行相乘的运算,得到的乘也是一个双精度数。最后取 其前7位赋给浮点型变量f。如是在数的后面加字母f 或F(如1.65f, 654.87F),这样编译系统就会把它 们按单精度(32位)处理。 39 3.5 字符型数据 3.5.1 字符常量字符常量 (1)用单引号包含的一个字符是字符型常量 (2)只能包含一个字符 a a, ,A A, , 1 1 abcabc、“a a

35、” 40 3.5 字符型数据 有些以有些以“ ”开头的特殊字符称为转义字符开头的特殊字符称为转义字符 n 换行 t 水平制表符号 r 回车 反斜杠 ddd ddd表示1到3位八进制数字 xhh hh表示1到2位十六进制数字 41 3.5 字符型数据 例3.5 转义字符的使用 #include #include void main()void main() printf( ab ct derftgn);printf( ab ct derftgn); printf( htibbj kn);printf( htibbj kn); o显示屏上的运行结果:显示屏上的运行结果: 单步执行看输出效果单步执行

36、看输出效果 42 3.5 字符型数据 3.5.2 字符变量字符变量 o 字符型变量用来存放字符常量,注意只能放一个字符。 o 字符变量的定义形式如下:char c1,c2; o 可以用下面语句对c1,c2赋值: c1a;c2 b ; o 一个字符变量在内存中占一个字节。 43 3.5 字符型数据 3.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法 o一个字符常量存放到一个字符变量中,实际上并不是把该字符的字型 放到内存中去,而是将该字符的相应的ASCII代码放到存储单元中。这 样使字符型数据和整型数据之间可以通用。 注意: 一个字符数据既可以 以字符形式输

37、出, 也可以以整数形 式输出。 44 3.5 字符型数据 例3.6 向字符变量赋以整数。 #include #include void main()void main() char c1,c2; char c1,c2; c1=97; c1=97; c2=98; c2=98; printf(“%c %cn”,c1,c2); printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); printf(“%d %dn”,c1,c2); 在第和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值 语句: c1;c2; 因为a和b的ASCII码为97

38、和98 o运行结果:运行结果: 97 9897 98 45 3.5 字符型数据 例3.7 大小写字母的转换 #include #include void main()void main() char c1,c2 char c1,c2; c1=a;c1=a; c2=b; c2=b; c1=c1-32;c1=c1-32; c2=c2-32;c2=c2-32; printf(“ printf(“c c cc,c1,c2c1,c2);); 程序的作用是将两个小写字母a和b转换成大写字母A和B。从 代码表中可以看到每一个小写字母比它相应的大写字母 的ASCII码大32。语言允许字符数据与整数直接进行算术

39、运算。 o运行结果:运行结果: 46 3.5 字符型数据 3.5.4字符串常量字符串常量 o字符串常量是一对双撇号括起来的字符序列. o合法的字符串常量: “How do you do.”, “CHINA”, “a” , “$123.45” o可以输出一个字符串,如 printf(“How do you do.”); 是字符常量,”是字符串常量,二者不同。 如:如:假设被指定为字符变量 :char c c=a; ”a”;c”CHINA”; 结论:结论:不能把一个字符串常量赋给一个字符变量。 47 3.5 字符型数据 o规定:在每一个字符串常量的结尾加一个 “字符串结束标志”,以便系统据此 判断

40、字符串是否结束。规定以字符作为字符串结束标志。 如:如:如果有一个字符串常量” ,实际上在内存中是: CHINA0 它占内存单元不是个字符,而是个字符,最后一个字符为。但在 输出时不输出。 第七章 数组 会进一步的讲解 48 3.6 变量赋初值 (1)(1)语言允许在定义变量的同时使变量初始化语言允许在定义变量的同时使变量初始化 如如: : int a=3; / int a=3; / 指定为整型变量,初值为指定为整型变量,初值为 float f=3.56; / float f=3.56; / 指定为浮点型变量,初值为指定为浮点型变量,初值为.56 .56 char c= a; / char c

41、= a; / 指定为字符变量,初值为指定为字符变量,初值为aa (2)(2)可以使被定义的变量的一部分赋初值。可以使被定义的变量的一部分赋初值。 如如: : int a,b,c=5int a,b,c=5; 表示指定、为整型变量,但只对初始表示指定、为整型变量,但只对初始 化,化,c c的初值为的初值为 (3)(3)如果对几个变量赋以同一个初值,如果对几个变量赋以同一个初值, 应写成:应写成:int a=3,b=3,c=3; int a=3,b=3,c=3; 表示、的初值都是。表示、的初值都是。 不能写成不能写成 int a=b=c3;int a=b=c3; 注意:注意:初始化不是在编译阶段完成

42、的而是在程序运行时执行本函数时赋初值的,相当 于有一个赋值语句。 49 3.7 各类数值型数据间的混合运算 混合运算:混合运算:整型(包括整型(包括int,short,longint,short,long)、浮点型(包括)、浮点型(包括float,doublefloat,double) 可以混合运算。在进行运算时,不同类型的数据要先转换成同一类可以混合运算。在进行运算时,不同类型的数据要先转换成同一类 型型, ,然后进行运算然后进行运算. . 说明: 这种类型转换是由系统自动进行 的。 50 3.8 算术运算符和算术表达式 3.8.1 运算符简介运算符简介 的运算符有以下几类:的运算符有以下几

43、类: (1)(1)算术运算符算术运算符 (+ + - - * * / / % %) (2)(2)关系运算符关系运算符 ( !)!) (3)(3)逻辑运算符逻辑运算符 (!(! |) (4)(4)位运算符位运算符 ( | | ) (5)(5)赋值运算符赋值运算符 (及其扩展赋值运算符)(及其扩展赋值运算符) (6)(6)条件运算符条件运算符 (?(? :):) (7)(7)逗号运算符逗号运算符 ( (,),) (8)(8)指针运算符指针运算符 (* *和)和) (9)(9)求字节数运算符()求字节数运算符() (10)(10)强制类型转换运算符(强制类型转换运算符( ( (类型)类型) ) )

44、(11)(11)分量运算符(分量运算符( -) (12)(12)下标运算符(下标运算符( ) (13)(13)其他其他 (如函数调用运算符()(如函数调用运算符() 51 3.8 算术运算符和算术表达式 3.8.2 算术运算符和算术表达式算术运算符和算术表达式 (1)(1)基本的算术运算符基本的算术运算符: : (加法运算符,或正值运算符。如:、) (减法运算符,或负值运算符。如:、) * * (乘法运算符。如:*) (除法运算符。如:) (模运算符,或称求余运算符,两侧均应为整型数据,如:的值 为)。 52 3.8 算术运算符和算术表达式 (2) (2) 算术表达式和运算符的优先级与结合性基

45、本的算术运算符算术表达式和运算符的优先级与结合性基本的算术运算符: : 用算术运算符和括号将运算对象用算术运算符和括号将运算对象( (也称操作数)连接起来的、符合也称操作数)连接起来的、符合 语法规则的式子,称为算术表达式。语法规则的式子,称为算术表达式。运算对象包括常量、变量、函 数等。 例如例如: : *.5a 是一个合法的表达式 o语言规定了运算符的优先级和结合性。语言规定了运算符的优先级和结合性。 在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。 o规定了各种运算符的结合方向规定了各种运算符的结合方

46、向( (结合性结合性) ) 算术运算符的结合方向为算术运算符的结合方向为“自左至右自左至右”,即运算对象先与左侧的运算符结合。,即运算对象先与左侧的运算符结合。 53 3.8 算术运算符和算术表达式 (3)(3)强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成 所需类型。 一般形式:(类型名)(表达式) 例如:例如: o(double) 将转换成double类型 o(int)(x+y) 将x+y的值转换成整型 o(float)(5%3) 将5%3的值转换成float型 54 3.8 算术运算符和算术表达式 例3.8 强制类型转换。 #include #incl

47、ude voidvoid()() ; ; ; ();(); printf(x=%fprintf(x=%f, i=%dni=%dn,x x,i);i); 有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型 转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时, 可以用强制类型转换。 o运行结果:运行结果: x3.600000, i=3 55 3.8 算术运算符和算术表达式 (4)(4) 自增、自减运算符自增、自减运算符 作用是使变量的值增或减作用是使变量的值增或减 如如: n,(在使用之前,先使的值加(减),(在使用之前,先使的值加(减) n,(在使用之后,(在使用

48、之后, 使的值加(减)使的值加(减) i+i+与与+i+i的区别:的区别: 是先执行后,再使用的值;是先执行后,再使用的值; 是先使用的值后,再执行。是先使用的值后,再执行。 例如:例如: ; i i的值先变成的值先变成4, 4, 再赋给再赋给,j,j的值均为的值均为 ; 先将先将 i i的值的值3 3赋给赋给, ,的值为,然后变为的值为,然后变为 56 3.8 算术运算符和算术表达式 注意:注意: (1)自增运算符(),自减运算符(),只能用于变量,而 不能用于常量或表达式, (2)和的结合方向是“自右至左”。 自增(减)运算符常用于循环语句中使循环变量自动加。也用于 指针变量,使指针指向下

49、一个地址 57 3.8 算术运算符和算术表达式 (5) (5) 有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译 系统自己安排。 例如:对表达式 a = f1( )+f2( ) 并不是所有的编译系统都先调用f1( ), 然后调用f2( )。在有的情况 下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要 小心谨慎。 语言中有的运算符为一个字符,有的运算符由两个字符组成 ,为避 免误解,最好采取大家都能理解的写法。 例如:不要写成i+j的形式,而应写成 (i+)+j的形式 58 3.8 算术运算符和算术表达式 在调用

50、函数时,实参数的求值顺序,标准并无统一规定。 例如:例如:的初值为,如果有下面的函数调用: printf(,i+) 在有的系统中,从左至右求值, 输出“,”。在多数系统中对函数参数的求值顺序是自右而左, 函数输出的是“,”。以上这种写法不宜提倡, 最 好改写成 j = i+;j = i+; printf(%d printf(%d, %d%d, j j,i)i) 不要写出别人看不懂的也 不知道系统会怎样执行程 序 59 3.9 赋值运算符和赋值表达式 (1)(1)赋值运算符赋值运算符 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一 个变量。如“”的作用是执行一次赋值操作(或称赋值 运算)

51、。把常量赋给变量。也可以将一个表达式的值赋给 一个变量. (2) (2)类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或如果赋值运算符两侧的类型不一致,但都是数值型或 字符型时,在赋值时要进行类型转换。字符型时,在赋值时要进行类型转换。 60 3.9 赋值运算符和赋值表达式 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数 的小数部分。 如如: :为整型变量,执行“i=3.56”的结果是使的值为,以整 数形式存储在整型变量中. 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形 式存储到变量中 如如: : 将23赋给float变量,即执行23,先将23转换成 230

52、0000,再存储在中。 将23赋给double型变量,即执行23,系统将23补足有 效位数字为2300000000000000,然后以双精度浮点数形式存 储到变量中。 61 3.9 赋值运算符和赋值表达式 将一个double型数据赋给float变量时,截取其前面7位有效数字, 存放到float变量的存储单元(4个字节)中。但应注意数值范 围不能溢出。 如如: :float f;double d=123.456789e100; f=d; 就出现溢出的错误。 如果将一个float型数据赋给double变量时,数值不变,有效位数 扩展到16位,在内存中以8个字节存储 字符型数据赋给整型变量时,由于字

53、符只占1个字节,而整型变 量为个字节,因此将字符数据(个二进位)放到整型变量 存储单元的低位中。 62 3.9 赋值运算符和赋值表达式 第一种情况:低位对应、高位补零低位对应、高位补零 若所用系统将字符处理为无符号字符 类型,或程序已将字符变量定义为 unsigned char型,则将字符的位放到 整型变量低位,高位补零。例如:例如: 将字符将字符376赋给赋给int型变量型变量 第二种情况:符号扩展符号扩展 若所用系统将字符处理为带符号(signed char)时,若字符最高位为, 则整型变量高位补;若字符最高位为,则高位全补。这称为“符 号扩展”,这样做的目的是使数值保持不变,如变量(字符

54、376)以 整数形式输出为,的值也是。 63 3.9 赋值运算符和赋值表达式 将一个int、short、long型数据赋给一个char型变量时, 只将其低8位原封不动地送到char型变量(即截断)。 例如:例如:int i=289;char c=a; c=i; c的值为33, 如果用“%c”输 出c,将得到字符“!” !的ASCII码为33。 赋值情况赋值情况 : 64 3.9 赋值运算符和赋值表达式 将带符号的短整型数据(short型)赋给int或long 型变量时,要进行符号扩展,将短整型数的16位送 到int或long型低16位中: (与教材有区别)(与教材有区别) n如果short型数

55、据为正值(符号位为),则long型变量的 高16位补; n如果short型变量为负值(符号位为),则long型变量的 高16位补,以保持数值不改变。 反之,若将一个long型数据赋给一个short型变量,只将 long型数据中低16位原封不动地送到短整型变量(即截 断)。 65 3.9 赋值运算符和赋值表达式 将unsigned short int型数据赋给long int型变量时,不存在符 号扩展问题,只需将高位补即可。 将一个unsigned类型数据赋给一个占字节数相同的非unsigned型 整型变量(例如:unsigned int -int,unsigned long- long,uns

56、igned short-short),将unsigned型变量的内容 原样送到非unsigned型变量中,但如果数据范围超过相应整型 的范围,则会出现数据错误。 将非unsigned型数据赋给长度相同的unsigned型变量,也是原样 照赋(符号位也作为数值一起传送)。 66 3.9 赋值运算符和赋值表达式 例3.9 有符号数据传送给无符号变量。 #include #include void mainvoid main()() unsigned unsigned ; int int ; ; printprint(nn,);,); “%u”是输出无符号数时所用的格式符。如果为正值,且在 2147

57、483647之间,则赋值 后数值不变。 运行结果:运行结果: 67 3.9 赋值运算符和赋值表达式 (3) (3) 复合的赋值运算符复合的赋值运算符 在赋值符“”之前加上其他运算符,可以构成复合的运算符。 例如例如: n 等价于 n* 等价于 *() n 等价于 为便于记忆,可以这样理解:为便于记忆,可以这样理解: a += b (其中a为变量,b为表达式) a += b(将有下划线的“a+”移到“=”右侧) |_ a = a + b (在“=”左侧补上变量名a) 68 3.9 赋值运算符和赋值表达式 注意注意: :如果是包含若干项的表达式,则相当于它有如果是包含若干项的表达式,则相当于它有

58、括号。括号。 如:如: x %= y+3 x %= (y+3) |_ x = x %(y+3)(不要错写成x=x%y+3) 凡是二元(二目)运 算符,都可以与赋值 符一起组合成复合赋 值符。 语言规定可以使用种复合赋值运算符:语言规定可以使用种复合赋值运算符: ,* *,| | 69 3.9 赋值运算符和赋值表达式 (4) (4) 赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表 达式”。 一般形式为一般形式为: 例如例如: “5”是一个赋值表达式 对赋值表达式求解的过程是:对赋值表达式求解的过程是: 求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变量。 例如例如: 赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。 70 3.9 赋值运算符和赋值表达式 o左值左值 (lvalue)(lvalue) : 赋值运算符左侧的标识符 n变量可以作为左值; n而表达式就不能作为左值(如a+b); n常变量也不能作为左值, o右值右值 (lvalue)(lvalue) :出现在赋值运算符右侧的表达式 n左值也可以出现在赋值

温馨提示

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

评论

0/150

提交评论