Presentation is loading. Please wait.

Presentation is loading. Please wait.

第2章 数据类型与数据运算.

Similar presentations


Presentation on theme: "第2章 数据类型与数据运算."— Presentation transcript:

1 第2章 数据类型与数据运算

2 本章主要内容 2.1 数据类型 2.2 常量 2.3 变量 2.4 数据运算

3 §2.1 数据类型 每一种类型的数据都分为常量和变量 数据类型 构造类型 指针类型 空类型(无值类型)void 枚举类型 enum 数组类型
§2.1 数据类型 数据类型 构造类型 指针类型 空类型(无值类型)void 枚举类型 enum 数组类型 结构体类型 struct 共用体类型 union 基本类型 整型 int 字符型 char 实型(浮点型) 单精度实型 float 双精度实型 double 每一种类型的数据都分为常量和变量

4 §2.2 常量 常量就是程序运行中不能改变的量,即固定的值。 如: 123,0,-3 为整型常量 0.4,-1.23 为实型常量
§2.2 常量 常量就是程序运行中不能改变的量,即固定的值。 如: 123,0,-3 为整型常量 0.4, 为实型常量 'a','h' 为字符型常量 “a”,“abc” 为字符串常量 在C语言中常用的常量有: 整型常量、实型常量、字符常量、字符串常量和符号常量。

5 §2.2 常量 §2.2.1 整型常量 C语言对整型常量有三种不同的表示形式: (1) 十进制整数:123,0,-45等
§2.2 常量 §2.2.1 整型常量 C语言对整型常量有三种不同的表示形式: (1) 十进制整数:123,0,-45等 (2) 八进制整数(以“0”开头):0123,-011等 0123表示(123)8 即:1*8²+2*8¹+3*8º=83 -011表示(-11)8 即:-(1*8¹+1*8º)=-9 (3) 十六进制(以“0x”开头):0x123,-0x12等 0x123表示(123)16 即:1*16²+2*16¹+3*16º=291 -0x12表示(-12)16 即:-(1*16¹+2*16º)=-18

6  §2.2 常量  1e3、1.8e-3、-123e-6、-.1e-3 e3、2.1e3.5、.e3、e §2.2.2 实型常量
§2.2 常量 § 实型常量 小数 指数 0.123 3e-3 两种表示形式 注意: 字母e(或E)之前必须有数字,且e后面的指数必须为整数 1e3、1.8e-3、-123e-6、-.1e-3 e3、2.1e3.5、.e3、e 规范化的指数形式: 在字母e(或E)之前的小数部分中,小数点前应有且只有一位非零的数字。

7 §2.2 常量 §2.2.3 字符型常量 'a', 'A', '1'  'abc' ,"a"  1.用单引号包含的一个字符是字符型常量。
§2.2 常量 §2.2.3 字符型常量 1.用单引号包含的一个字符是字符型常量。 'a', 'A', '1' 'abc' ,"a" 注意: (1)字符常量两侧的一对单引号是不可少的,作为字符常量的定界符。例如,'5' 是字符常量,而5则是整数。再如,'A' 是字符常量,而A则是标识符。 (2)字符常量的值就是该字符的ASCII码值,所以字符常量与值为其ASCII码值的整型常量等价。例如,'5' 的ASCII码值是53,与整型常量53等价;'A' 的ASCII码值是65,与整型常量65等价。 (3)字符 '0' 的ASCII码值是48,字符 'A' 的ASCII码值是65,字符 'a' 的ASCII码值是97。

8 §2.2 常量 §2.2.3 字符型常量 2. 以“\”开头的特殊字符称为转义字符 \n 换行 \t 横向跳格 \r 回车 \\ 反斜杠
§2.2 常量 §2.2.3 字符型常量 2. 以“\”开头的特殊字符称为转义字符 \n 换行 \t 横向跳格 \r 回车 \\ 反斜杠 \ddd ddd表示1到3位八进制数字 \xhh hh表示1到2位十六进制数字 注意:'\n','\'','\''','\\','\141','\x41' 等均表示一个字符。 由于回车符是不可显示字符,所以用 '\n' 表示;单引号、双引号作为定界符,已经是标识符,所以用 '\'' 和 '\''' 表示;反斜杠已经作为换码符,所以用 '\\' 表示;'\141' 与 'a' 等价,因为八进制的141是十进制的97,是字母a的ASCII码值。

9 §2.2 常量 §2.2.3 字符型常量 [例2.1] 转义字符举例。 void main() { printf("Hi!\t");
§2.2 常量 §2.2.3 字符型常量 [例2.1] 转义字符举例。 void main() { printf("Hi!\t"); printf("Hi!\n "); printf("\bHi!"); } 运行结果: Hi! Hi! Hi!

10 §2.2 常量 §2.2.4 字符串常量 字符串常量是用双引号括起来的字符序列。 如:"CHINA","a","I love China"
§2.2 常量 §2.2.4 字符串常量 字符串常量是用双引号括起来的字符序列。 如:"CHINA","a","I love China" 可以输出一个字符串,如: printf("HOW DO YOU DO!"); 注意: (1)区别字符常量'a'和字符串常量"a"的书写形式。 (2)字符串常量一个字符用一个字节存放,且最后加\0。 如:“CHINA”在内存中,占6个字节, (3)字符串书写和输出时,无\0。 C H I N A \0

11 §2.2 常量 §2.2.5 符号常量 符号常量是用一个标识符代表一个常量,在程序中用如下形式来定义。 #define 标识符 字符串
§2.2 常量 § 符号常量 符号常量是用一个标识符代表一个常量,在程序中用如下形式来定义。 #define 标识符 字符串 注意: ① 放在程序的最前面。 ② 通常“标识符”用大写字母,以与其它标识符区别。 ③ 符号常量的定义末尾不加“;” ④ 实际上是一种“宏定义”,详见第6章。

12 §2.2 常量 §2.2.5 符号常量 [例2.1] 符号常量的使用 #define PI 3.1416 main()
§2.2 常量 § 符号常量 [例2.1] 符号常量的使用 #define PI main() { float r, l,s; scanf("%f",&r); l=2*PI *r; s=PI *r*r; printf("r=%f l=%f s=%f ",r,l,s); } 注意: 不能给符号常量赋值。 如:PI=3.14; /* 错误,*/ 返回

13 §2.3 变量 §2.3.1 变量的概念 变量代表内存中的一个存储单元,用来存放数据,这个数据就是变量的值,在程序运行期间,这个值是可以改变的。 每个变量必须有一个变量名。 实际上,一个变量名对应一个地址。编译系统给每一个变量分配对应的内存单元。 从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。

14  §2.3 变量  §2.3.1 变量的概念 变量名就是标识符。命名规则为:
标识符只能由字母、数字和下划线三种字符组成,并且第一字符必须是字母或下划线,其长度随系统而不同,常定义1—8个字符。 例: sum,_total,ab,AB,x1,a_1 M.D.John,¥123,3D64,a>b 注意: (1)大小写字母是不同的字符,变量名常用小写 (2)标识符最好能做到“见名知义”。 (3)每个变量必属于一个确定类型,必须“先定义,后使用” 。

15 §2.3 变量 §2.3.2 变量的定义与初始化 1.变量的定义 定义变量就是说明变量的类型,以便系统为它分配相应的存储单元。 一般形式为:
类型标识符 变量名表; 其中: “变量名表”中可以有一个或多个变量名,变量名之间用逗号分隔。 基本数据类型标识符由系统提供,用户可以直接使用。

16 §2.3 变量 §2.3.2 变量的定义与初始化 1.变量的定义 基本数据类型标识符 类 型 类型标识符 占用存储空间 基本整型 int
类 型 类型标识符 占用存储空间 基本整型 int 2个字节 短整型 short int 或 short 长整型 long int 或 long 4个字节 无符号整型 unsigned int 字符型 char 1个字节 单精度浮点型 float 双精度浮点型 double 8个字节

17 § 2.3 变量 §2.3.2 变量的定义与初始化 1.变量的定义 例如: int sum; /* 定义一个整型变量sum */
long _a,_b; /* 定义2个长整型变量_a和_b */ char c1,c2; /* 定义2个字符型变量c1和c2 */ float f_1,f_2,g; /* 定义3个字符型变量f_1、f_2和g */ 注意: (1)类型标识符与变量名之间要有空格。 (2)若定义多个变量,变量名之间用逗号分隔,后面的分号表示定义结束。

18 § 2.3 变量 §2.3.2 变量的定义与初始化 2.变量的地址 3.变量的初始化
§ 变量 §2.3.2 变量的定义与初始化 2.变量的地址 计算机内存是以字节为单位编地址的,存储单元的首地址称为变量的地址。在C语言中,变量的地址用变量名前加符号“&”表示,如&sum表示sum的地址。 3.变量的初始化 变量定义后,其存储单元的内容(变量值)并不确定,是一个随机值。 在定义变量的同时给它设置初值,称为变量的初始化。 例如: int a=5,b=6,c=7; /* 定义3个变量a,b,c且全部赋初值 */ float x,y=3.5,z; /* 定义3个变量x,y,z,只有y被赋初值 */

19 §2.3 变量 §2.3. 3 变量的存储与变量的取值范围 1.变量的存储
数值是以补码的形式存储的。正整数的补码与其原码相同,负数的补码是将其原码的数值位取反加1。 例如:int a=32767,b=-32768,c=-1; unsigned int u=65535; char c1='a', c2=97;

20 §2.3 变量 §2.3. 3 变量的存储与变量的取值范围 1.变量的存储 [例2.3] 大小写字母的转换 void main()
{ int m,n; char c1,c2; m=97; c1='A'; n=m-32; c2=c1+32; printf("%d,%d\t",m,n); printf("%c,%c\n",m,n); printf("%d,%d\t",c1,c2); printf("%c,%c\n",c1,c2); } 运行结果: 97,65 a,A 65,97 A,a

21 § 2.3 变量 §2.3. 3 变量的存储与变量的取值范围 2.变量的取值范围 基本数据类型变量的取值范围
§ 变量 § 变量的存储与变量的取值范围 2.变量的取值范围 什么类型的变量就用来存放什么类型的数据,一个变量存放一个数据。由于类型不同所占存储单元大小就不同,能存储数据的范围也就不同。 基本数据类型变量的取值范围 类型 占用存储空间 变量的取值范围 有效数字 int 2个字节(16位) -32768~32767 short long 4个字节(32位) unsigned int 0~ 即0~(216-1) char 1个字节(8位) 0~255 float -3.4×10-38~3.4×1038 6~7 double 8个字节(64位) -1.7×10-308~1.7×10308 15~16

22 § 2.3 变量 §2.3. 3 变量的存储与变量的取值范围 2.变量的取值范围 [例2.4] 整型变量的溢出举例。 void main()
§ 变量 § 变量的存储与变量的取值范围 2.变量的取值范围 [例2.4] 整型变量的溢出举例。 void main() { int a,b; a=32767; b=a+1; printf("a=%d,b=%d",a,b); } 运行结果: a=32767,b=-32768 注意: (1)在程序设计时,要根据使用数据的范围定义不同类型的变量。定义过大浪费计算机资源,定义过小产生“溢出”或导致数据不精确。 (2)同一数据类型的变量在不同的机器中占字节数不同,是由机器字长决定的。这里以IBM PC机为例。 返回

23 §2.4 数据运算 在C语言中,除了控制语句和输入输出操作以外,几乎所有的基本操作都作为运算符处理。
操作数(运算量或运算对象):参加运算的数据。 运算符:其操作数可以是一个、两个或三个,分别称为单目运算符、双目运算符和三目运算符。 表达式:用运算符把运算对象连接起来的式子。 表达式类型(根据其值的类型区分):赋值表达式、算术表达式、关系表达式、逻辑表达式等。算术运算的结果是算术量,关系运算、逻辑运算的结果是逻辑量。 表达式运算时要注意: (1)运算符的优先级别 (2)运算符的结合方向 关于运算符的优先级和结合性详见附录B。

24 §2.4 数据运算 §2.4.1 赋值运算 1.赋值表达式 一般形式 :<变量名><赋值运算符><表达式> 赋值运算符“=”的左侧必须是变量名,右侧是任意类型的表达式(常量和变量是表达式的特例)。 求解过程:将右侧的表达式的值赋给左边的变量。结合方向是右结合。 如:a=b=3 /*将3赋给b,再将b的值3赋给a*/ 再如:x=(a=5)+(b=7) /*将5赋给a,7赋给b,a+b的结果12赋给x*/

25 §2.4 数据运算 §2.4.1 赋值运算 2.不同类型数据的赋值 做赋值运算时,系统对不同类型的数据自动进行类型转换,转换原则是:
(1) 数据长度相同的直接赋值。 (2) 把实型数据赋给整型变量时,小数部分截去;把整型数据赋给实型变量时,数值不变只转换成相应的实数形式。 (3) 长的数据给短的变量赋值,低位对齐赋值,高位丢失,有可能造成溢出。如:long int数据赋给int变量,高16位去掉,低16位赋值。 (4) 短的数据赋给长的变量,低位对齐赋值。对无符号数高位补0;对有符号数要进行“符号扩展”,即符号位为“0”,高位全补“0”;符号位为“1”,高位全补“1”。

26 §2.4 数据运算 §2.4.1 赋值运算 赋值运算注意事项 (1) 赋值运算符“=”不同于数学中的等号,它没有相等的含义。
例如:x=x+1 (2) 赋值运算符“=”的左侧必须是变量名,因为它代表一个存放值的存储单元。 例如:5=a 和 a+b=c 都是不合法的。 (3) 赋值操作是一种破坏性的操作,无论左侧变量中原来的值是什么,赋值后就被右侧表达式的值取代。 例如:a=5; a=10; 则a的值是10。 (4) 赋值表达式后加上分号就是赋值语句。 例如:a=5 是赋值表达式,而a=5; 是赋值语句。

27 §2.4 数据运算 §2.4.1 赋值运算 3.自增与自减运算符 ++、--运算符是单目运算符,其操作数只能是变量,运算符可以出现在变量之前,也可以出现在变量之后。 (1) 在表达式中,++、--运算符出现在变量之前和出现在变量之后作用不相同。例如: ++i(或—i)是先把i存储单元的值加1(或减1),然后引用i; i++(或i--)是先引用i,然后把i存储单元的值加1(或减1)。 (2)作为独立的表达式语句时,++、--运算符出现在变量之前或之后作用相同,就是使变量的值增1或减1。例如: ++i;和 i++; 都相当于i=i+1;是赋值语句。 --i;和 i--; 都相当于i=i-1;也是赋值语句。

28 §2.4 数据运算 3.自增与自减运算符 [例2.5] 自增、自减运算符举例。 void main()
{ int i=2,j=2,a1,b1,a=3,b=3; i++; ++j; printf("i=%d,j=%d\n",i,j); a1=a++; printf("a=%d,a1=%d\n",a,a1); b1=++b; printf("b=%d,b1=%d\n",b,b1); } 运行结果: i=3,j=3 a=4,a1=3 b=4,b1=4

29 §2.4 数据运算 §2.4.2 算术运算 1.算术运算符 ( ) 高 低 - (负号) * (乘) / (除) 优先级别相同(右结合)
- (负号) * (乘) / (除) % (取余) + (加) - (减) 高 低 优先级别相同(右结合) 优先级别相同(左结合) 优先级别相同(左结合) 注意:(1)两个整数相除,结果为整数,舍去小数。 (2)取余运算要求操作数均为整数。

30 §2.4 数据运算 §2.4.2 算术运算 2.算术表达式 将数学表达式转换成C语言算术表达式: (1)乘号不可以省略。
如:p(p-a)(p-b)(p-c) 必须写成:p*(p-a)*(p-b)*(p-c)。 (2)分数线用/代替,用括号实现正确的逻辑关系。 如: 必须写成:(b*b-4*a*c)/(2*a)

31 §2.4 数据运算 §2.4.2 算术运算 4.各种类型数据混合运算
在算术表达式中,字符型数据与整型数据通用,各种类型的数据可以混合运算。运算时,先将不同类型的数据转换成相同类型,然后再计算。这种转换是系统自动完成的。 转换规则是: (1)若操作数是float型必须转换为double型;若操作数是short型或char型必须转换为int型; (2)若两个操作数类型不同时,将其中短类型的转换为长类型,并进行符号扩展。数据类型级别由低到高表示如下: int→unsigned→long→double型。

32 §2.4 数据运算 §2.4.3 关系运算 1.关系运算符 关系运算符就是比较运算符,共6种,结合方向都是左结合。 < (小于)
< (小于) <= (小于等于) > (大于) >= (大于等于) == (等于) != (不等于) 优先级别相同 高 低 优先级别相同 说明: 关系运算符的优先级低于 算术 运算符 关系运算符的优先级高于 赋值 运算符

33 §2.4 数据运算 §2.4.3 关系运算 2.关系表达式 例:① a+b>b+c ② (a>b)>(b<c)
用关系运算符将两个表达式(可以是算术表达式、关系表达式,赋值表达式,字符表达式)连接起来的式子,称关系表达式。 注意: ①C没有逻辑型数据,用“1”表示“真”,用“0”表示“假”。 ②当进行判断时,非零即“真”,零即“假”。 例:① a+b>b+c ② (a>b)>(b<c) ③ (a=3)>(b=5) ④ 'a'<'b' 1 若a=5,b=3,c=4,则 关系表达式的值是一个逻辑值,即“真”或“假”。 例:若有int a=1,b=2,c=3;则 a+b==c 值为1 ; a!=b>c 值为1(b>c为0,a<>0) d=a>b d值为0 ; f=c>b>a f值为0(c>b为1,1>a为0)

34 §2.4 数据运算 §2.4.4 逻辑运算 1.逻辑运算符 双目运算符,左结合性。 ① && (逻辑与)
② || (逻辑或) ③ ! (逻辑非) 当两个操作数均为“真”时,表达式为真,其余为“假”。 当两个操作数均为“假”时,表达式为“假”,其余为“真”。 取操作数的相反值。 优先次序: ① &&和||的优先级低于关系运算符 ② !的优先级高于算术运算符 单目运算符,右结合性。

35 §2.4 数据运算 §2.4.4 逻辑运算 2.逻辑表达式 逻辑表达式就是用逻辑运算符将关系表达式或逻辑量 连接起来的式子。
逻辑表达式的值是一个逻辑值,即“真”或“假”。 如:int a=3,b=4; ① a<5&&b>5 值为0 ② a<5||b>5 值为1 ③ !(a-b) 值为0 ④ !a||b 值为1 ⑤ 4&&0||2 值为1

36 §2.4 数据运算 §2.4.4 逻辑运算 说明: ①在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。 如:a&&b&&c 只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。 再如:a||b||c 只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c ②注意表达式的书写。 如:数学中的不等式:0<x<10 C语言中应写成:x>0 && x<10 ③逻辑运算符的两侧可以是任何类型的数据,只需区别0和非0。若为字符型,则按其ASCII码值处理。

37 §2.4 数据运算 §2.4.5 位运算 所谓位运算是指二进制位的运算,即运算的单位是二进制的一个位。
位运算常用于计算机的检测和控制领域中。 位运算的操作数只能是整型或字符型。 在程序中,若进行位运算的数据不是用二进制表示的,要先转换成二进制补码形式再运算,运算后的结果再转换成要求的进制。

38 §2.4 数据运算 §2.4.5 位运算 1.位运算符 六种位运算符 ~ 按位取反 << 左移位 >> 右移位
~ 按位取反 << 左移位 >> 右移位 & 按位与 ^ 按位异或 | 按位或 高 低 优 先 级 ~为单目运算符,右结合;其余都是二目运算符,左结合。

39 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (1)按位与运算(&)
两个操作数的对应位都是1时,该位为1,否则该位为0。即1&1=1,1&0=0, 0&1=0 ,0&0=0 例:65&15 作用:①清零:与0相与对应位清零; ②保留原值:与1相与对应位保留原值。

40 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (2)按位或运算(|)
两个操作数的对应位都是0时,该位为0,否则该位为1。即1|1=1,1|0=1 ,0|1=1 ,0|0=0 例:char a=0x41,b=0x0f; 求a|b 作用:①置1:与1相或对应位置1; ②保留原值:与0相或保留对应位。

41 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (3)按位异或运算(^)
两个操作数对应位相异为1,相同为0 。即1^1=0,1^0=1, 0^1=1 ,0^0=0 例:char a=0101,b=017; 求a^b 作用:①位翻转:与1相异或对应位翻转; ②保留原值:与0相异或保留对应位; ③交换两个值,不用临时变量。

42 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (4)按位取反(~) 操作数对应位0变1,1变0 。即~1=0,~0=1
例如:char ch=15; ch=~ch ; 即~( ) 结果: 。

43 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (5)左移位(<<)
用来将一个数的各二进位全部左移若干位,高位溢出舍弃,低位补0。操作数每左移一位,相当于乘以2,左移n位即乘以2n。 例如:char ch=16; ch=ch<<2; 结果: 。

44 §2.4 数据运算 §2.4.5 位运算 2.位运算表达式 (6)右移位(>>)
用来将一个数的各二进位全部右移若干位,低位舍弃,对于无符号数,高位补0。对于有符号数高位是补0 还是补1 ,取决于系统: ①若无论操作数是正还是负都高位补0,称为“逻辑右移”; ②若操作数为正高位补0,为负高位补1,称为“算术右移”。操作数每右移一位,相当于除以2,右移n位即除以2n 。 ③在 turbo C中右移采用“算术右移”。

45 §2.4 数据运算 §2.4.5 位运算 [例2.6] 移位运算举例。 void main()
[例2.6] 移位运算举例。 void main() { unsigned int a=4,b=20; a=a<<3; b=b>>1; printf("a=%d,b=%d\n",a,b); } 运行结果: a=16,b=5; 可见: 操作数左移n位,相当于乘以2 n ; 操作数右移n位,相当于除以2 n 。

46 §2.4 数据运算 §2.4.6 其它运算 1.复合的赋值运算 算术运算和位运算中的二目运算符,都可以与赋值运算符组成复合赋值运算符。
共10种,即:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=。它们与“=”优先级别相同,结合方向也相同,都是右结合。 例如:a+=3 等价于 a=a+3 x%=2 等价于 x=x%2 x*=y+5 等价于 x=x*(y+5) a&=b 等价于 a=a&b x>>=2 等价于 x=x>>2

47 §2.4 数据运算 §2.4.6 其它运算 1.复合的赋值运算 赋值号右端表达式也可以包含复合运算符。
若有定义:int x=5,y=3,z=8; 则赋值表达式:x+=y-=z*=x+6 可以分解为:z*=x+6; y-=z; x+=y; 求解过程是: ①先计算z*=x+6,等价于z=z*(x+6),所以为z赋值88; ②再计算y-=z,为y赋值-85 ③最后计算x+=y,为x赋值-80 注意: 若进行运算的两个操作数长度不同,应先以长的为基准,右端对齐,短的是正数左边补0,是负数左边补1,补齐后再运算。

48 §2.4 数据运算 §2.4.6 其它运算 2.条件运算 条件运算符(? :)是唯一的一个三目运算符。 条件表达式的一般形式:
表达式1?表达式2 :表达式3 条件表达式的求解过程: 若表达式1为“真”,计算表达式2,取表达式2的值作为条件表达式的值;否则计算表达式3,取表达式3的值作为条件表达式的值。 优先级别: 低于算术运算、关系运算、位运算、逻辑运算,高于赋值运算。 结合方向:右结合。 如:a>b?a:c>d?c:d相当于a>b?a:(c>d?c:d)

49 §2.4 数据运算 §2.4.6 其它运算 2.条件运算 若if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句,且给同一个变量赋值,此时用条件表达式处理最简便。 例如:将a,b中大者放到max中。 用条件语句:if(a>b) max=a; else max=b; 用条件运算符: max=(a>b)?a:b; 注意: 当表达式2与表达式3类型不同时,条件表达式取二者中较高的类型。 如:a>b?3:1.5 (若a>b为真,则表达式值为3.0)

50 §2.4 数据运算 §2.4.6 其它运算 3.逗号运算 逗号运算符优先级最低,结合方向为左结合。
一般形式:<表达式1>,<表达式2> 求解过程:先求<表达式1>的值,再求<表达式2>的值,并将<表达式2>的值作为整个表达式的值。 一般形式可扩展为:<表达式1>,<表达式2>,……,<表达式n> 其值为<表达式n>的值。 如:3*5,4+6 值为10;而:a=3*5,a+6 值为21 再如:(a=3*5,a+6),a+5 值为20 注意: (1) 并非所有的逗号都是运算符,逗号还可作分隔符。 (2) 逗号表达式常用于for语句中。

51 §2.4 数据运算 §2.4.6 其它运算 4.求字节运算 求字节运算符(sizeof)用于计算其操作数所占存储空间的字节数。它是单目运算符,结合方向是右结合。其操作数可以是类型标识符,也可以是表达式。 一般形式为:sizeof(类型标识符) 或: sizeof(表达式) [例2.7] 求字节运算符举例。 void main() { int a=5; float f=7.8; printf(“double: %d\n”,sizeof(double)); printf("float: %d\n", sizeof(f)); printf("int + float: %d\n", sizeof(a+f)); } 运行结果: double: 8 float: 4 int + float: 8

52 §2.4 数据运算 §2.4.6 其它运算 5.强制类型转换运算 当各种类型的数据进行混合运算时,系统会自动进行类型转换,然后再计算。
C语言还提供了一种用户自己进行的数据类型转换,这种转换是一种运算,即强制类型转换运算。 运算符:(类型) 是单目运算符,右结合,优先级别仅低于圆括号。 一般格式: (类型)(表达式) 作用:将表达式的值转换成所需类型。 如:(double)a 将a转换为double型 (float)(5%3) 将5%3的值转换为float型

53 §2.4 数据运算 §2.4.6 其它运算 5.强制类型转换运算 注意: (1) 表达式应括起来。
如:(int)x+y 只将x转换为int型 (2)强制类型转换只得到该类型的中间量,原变量类型不变。 如:float a=8.5 ,b=3.4 ; int x; x=(int)a%(int)(b); 由于运算符%要求操作数类型为整型,而a和b为实型无法运算,所以需要进行强制类型转换。运算结果:x值为2,a,b仍为float型。 可见有两种类型转换:系统自动进行的类型转换和用户进行的强制类型转换。

54 §2.4 数据运算 (2) x=a=3,6,3 练习1:将下列数学表达式转换成C语言表达式 练习2: 练习3: 有表达式:
设:a=2.5,b=7,c=4.7,d=5; (1) a+b%3*(int)(a+c)%2/4 (2) b%(int)(d/a)+c 两表达式的值各为多少? 返回


Download ppt "第2章 数据类型与数据运算."

Similar presentations


Ads by Google