Presentation is loading. Please wait.

Presentation is loading. Please wait.

数据类型与运算规则.

Similar presentations


Presentation on theme: "数据类型与运算规则."— Presentation transcript:

1 数据类型与运算规则

2 第三章 数据类型与运算规则 本 章 要 点 基本数据类型与特点 各种数据类型表示范围 常量的表示方法 变量说明语句 运算符与基本运算规则

3 第一节 数据与数据类型 第二节 基本数据类型及其表示 第三节 算术运算与赋值运算 第四节 关系运算与逻辑运算 第五节 位运算
第三章 数据类型与运算规则 第一节 数据与数据类型 第二节 基本数据类型及其表示 第三节 算术运算与赋值运算 第四节 关系运算与逻辑运算 第五节 位运算 第六节 其它运算 第七节 混合运算及数据类型转换 第八节 应用实例

4 §3-1 数据与数据类型 一、基本概念 数据 程序加工处理的对象及其结果 数据类型 数据在计算机内部的存储形式(占用的内存单元数量、编码方式、取值范围等) 常量 在程序运行过程中不允许改变的量 变量 在程序运行过程中允许改变的量

5 §3-1 数据与数据类型(续) 二、C语言的数据类型 字符型 char 整型 int 浮点型 基本类型 单精度 float
第三章 字符型 char 整型 int 浮点型 基本类型 单精度 float 双精度 double 指针类型 指针类型 数组 结构 struct 联合 union 枚举 enum 第七章 第十一章 构造类型 第九章 无值类型

6 注意:类型修饰符不能单独使用,必须与类型说明符配合在一起使用
§3-2 C语言的基本数据及其表示 一、C语言的基本数据类型 C语言基本数据类型有四种: 字符型 整型 单精度浮点型 双精度浮点型 类型说明符 char int float double C语言采用类型说明符说明不同的数据类型 C语言有四种类型修饰符: 有符号 无符号 类型修饰符 short long signed unsigned 注意:类型修饰符不能单独使用,必须与类型说明符配合在一起使用

7 float:尾数24位+阶数8位 double:尾数52位+阶数12位
§3-2 C语言的基本数据及其表示 二、基本数据类型的数据表示与取值范围 基本数据类型的数据存储格式和取值范围: 类型 占用内存单元 取值范围 数据存储格式 char ( 8位) ~ ASCII码 int (16位) ~ 二进制补码 float 4(32位) ±3.4*10-38~±3.4* 位有效数字 double 8(64位) ± ~± 位有效数字 保存字符对应的ASCII码 -215 无法表示全体实数 215-1 1000,0000,0000,0000 0111,1111,1111,1111 float:尾数24位+阶数8位 double:尾数52位+阶数12位

8 §3-2 基本数据类型-int int型数的表示范围:二进制 16bit (2Byte) int型整数的最大值 =215-1=32767 =3 =1 int型整数的最小值 =-215=-32768 =-1 int型表示数的范围: ~ 32767 注意:使用中要防止数据溢出 返回 例 2_202

9 实际运行结果 §3-2 基本数据类型-int i=2 i=6 i=24 i=120 i=720 产生数据溢出 i=5040 i=-25216
main( ) { int i; i= 1; i=i*2; printf(”\n i=%d”,i); i=i*3; printf(”\n i=%d”,i); i=i*4; printf(”\n i=%d”,i); i=i*5; printf(”\n i=%d”,i); i=i*6; printf(”\n i=%d”,i); i=i*7; printf(”\n i=%d”,i); i=i*8; printf(”\n i=%d”,i); i=i*9; printf(”\n i=%d”,i); i=i*10; printf(”\n i=%d”,i); } 实际运行结果 i=2 i=6 i=24 i=120 i=720 i=5040 i=-25216 i=-30336 i=24320 期望结果 i=2 i=6 i=24 i=120 i=720 i=5040 i=40320 i=362880 i= 例C2_202 产生数据溢出 上溢 下溢 返回

10 §3-2 基本数据类型-float 2-23 <= |尾数| <= 1-2-23
有效数字的意义? 数的范围的意义? 阶码 尾数 单精度实型 二进制 7位 二进制 23位 阶码的符号位 尾数的符号位 2-23 <= |尾数| <= 例C2_203 0.000,000,12 <= |尾数| <= 0.999,999,88 2-128 <= |阶码| <= 2127 2.9*10-39 <= |阶码| <= 1.7*1038 返回

11 加修饰符数据类型的数据存储格式和取值范围:
§3-2 基本数据类型-类型修饰 加修饰符数据类型的数据存储格式和取值范围: short int <==> int <==> short signed <==> int <==> short int <==> short 类型 占用内存单元 取值范围 unsigned int 2字节 ~ 65535 long int 字节 ~ unsigned long 4字节 ~ -231 216-1 232-1 231-1

12 §3-2 基本数据类型-常量 三、常数 整型常量(3种形式) 10进制 8进制 :0 ~9 16进制 实型常量(2种形式)
十进制 指数 字符常量 字符串常量 整型常量实例 :0 ~9 :0 ~7 以数字0开头 :0 ~9,A~F/a~f,以0x或0X开头 实型常量实例 :符号、整数、小数点和小数 :用e或E和表示指数部分 字符常量 字符串常量

13 2.在常量后面加l或L,则认为它是long int型 例如:都是long int型常量 10进制:-123L 0L 432l
§3-2 基本数据类型-整型常数实例 整型常量的不同表示方法: 10进制: 8进制: 16进制: 0x38 0x10 0X10 0XFF 0xa 整型常量的类型: 1.在整型表示范围之内,根据值大小默认类型 2.在常量后面加l或L,则认为它是long int型 例如:都是long int型常量 10进制:-123L 0L l 8进制: 010L 024L L 16进制: 0x38L 0x1000L 0XFFl x0a0000l 返回

14 §3-2 基本数据类型-实型常数实例 实型常量的不同表示方法: 10进制:1.0 1. +12.0 -12.0 0.0
10进制: 指数:1e e e-6 等价于: * *10-6 指数:-.1e E10 等价于:-0.1* *10-10 返回

15 回车/退格/TAB? 转义符\:将\后面的字符转换为其它含义 §3-2 基本数据类型-字符常数 字符型常量:用单引号括起来的单个字符
实例:’A’ ’g’ ’#’ ’0’ ’2’ ’+’ ’,’ ’;’ ’(’ ’)’ 字符定界符:单引号 ’ 字符型数据的存储格式:ASCII码(见书P207) 如何表示不可显示字符? 回车/退格/TAB? 如何表示定界符? ’’’ 产生歧异 转义符\:将\后面的字符转换为其它含义 返回

16 §3-2 基本数据类型-转义符常数 字符形式 功能 使用举例 \0 字符串结束标志
字符形式 功能 使用举例 \0 字符串结束标志 \n 换行(ASCII码为10) printf(”\n”); \t 横向跳格 printf(”\t”); \b 退格 \r 回车(ASCII码为13) \f 走纸换页 \\ 字符\(ASCII码为92) ’\\’ 表示字符 \ \’ 单引号 ’\’’ 表示字符 ’ \” 双引号 ’\”’ 表示字符 ” \ddd 用8进制表示字符 ’a’=’\141’ ’A’=’\101’ 换行符 ’\12’ \xhh 用16进制表示字符 ’a’=’\x61’ ’A’=’\x41’ 换行符 ’\xa’ 返回

17 注意: 字符串"a" 与 字符’a’ 的区别 §3-2 基本数据类型-字符串常数 字符串常量:用双引号括起来的字符序列
实例:”This is C string.” ”a” ” ” (1个空格) ”” (不含空格) 串定界符:双引号 ” 字符串长度:字符串中包含的字符数量。 串长=17 串长=1 串长=0 空串 实例: "\t\"Name\\Address\n" 串长=15 "\"C is very easy.\"" 串长=17 "He said\"ok.\"\n" 串长=13 注意: 字符串"a" 与 字符’a’ 的区别 返回

18 注意:符号常量与变量不同,它的值在程序运行过程中不能改变,也不能重新赋值。
§3-2 基本数据类型 四、常数定义与符号常量 常量定义形式 #define 标识符 常量 用定义的一个标识符来代表一个常量,称为符号常量 # 宏命令专用定义符号 define 命令 标识符 宏替换名(一般采用大写字符) 常量定义实例 注意:符号常量与变量不同,它的值在程序运行过程中不能改变,也不能重新赋值。

19 #define TV ”television” #define MAX 10 #define TWO ONE+ONE 使用方法 a=8+2;
§3-2 基本数据类型-常量定义实例 常量定义实例 #define ONE 1 #define PAI #define TV ”television” #define MAX #define TWO ONE+ONE 使用方法 a=8+2; printf(”%s”,”television”); s= *r*r; int array[10]; a=b+TWO; printf(”%s”,TV); s=PAI*r*r; int array[MAX]; 返回

20 §3-2 基本数据类型-变量与变量说明 五、变量说明的基本概念 变量:在程序运行过程中允许改变的量 变量的说明格式: [类型修饰符] 类型说明符 变量列表; 例如:int i; char ch, str; long k=1, m=0x ; double x, y=1; 变量说明意味着确定了:该变量 占用内存单元的数量, 数据在内存的表示方式, 数据的取值范围。

21 §3-2 基本数据类型-指针变量 六、指针与指针变量 变量的三个属性: – 变量名称:编程时使用(进行编程) – 变量的值:程序运行时使用(进行运算) – 变量地址:程序运行时,要将变量的值保存在计算机的存储单元中,每个存储单元都有唯一的内存地址。变量在内存中占据的存储单元的地址就是变量的地址。 指针:变量的地址 一般变量:存储变量的值 指针变量:保存变量地址的变量

22 §3-2 基本数据类型-指针变量 指针变量说明: 数据类型 * 变量名; 例:有变量说明语句:char c='A'; 若变量c在内存中对应的地址为1000; * 变量名称:c,类型为char,占用1个字节 * 变量c的值: 字母’A’ * 变量c的地址:1000 若有:char * pc; 则称指针变量pc是char型指针 pc=&c; /* &取c的地址 */ 则称指针变量pc指向变量c

23 §3-2 基本数据类型-变量赋初值 七、变量赋初值 变量在说明之后,没有固定的初始值,要先赋值(给定一个初始值),后使用。 变量赋初值 将变量说明与赋初值合一,在说明变量时同时完成。 实例 char cc = 'a', dd = '\n' ; int x = 10, y = -10, z; double try = 28.5, w = 1e10;

24 按运算类型分类 按运算对象的数目分类 目:进行运算时需要的操作数的数量 §3-3 算术运算与赋值运算 运算符简介
1. 算术运算符 关系运算符 3. 逻辑运算符 位运算符 5. 赋值与赋值组合运算符 自增自减运算符 7. 条件运算 指针运算 9. 其它运算符 按运算对象的数目分类 ◆ 单目运算 ◆ 双目运算 ◆ 三目运算 目:进行运算时需要的操作数的数量

25 §3-3 算术运算与赋值运算-算术运算 一、算术运算符 运算符(双目运算符/单目运算符) + 加法运算 正值运算 14 - 减法运算 负值运算 14 * 乘法运算 13 / 除法运算 13 % 求余运算 13 优先级:* / % 同级(高),+ - 同级(低) 结合性:相同优先级运算符进行运算时的次序 自左向右(标记为 → )

26 §3-3 算术运算与赋值运算-算术运算实例 1.参加运算的对象都是int型,结果截取为int型 10/ /3 10.0/ /3. 1/ /2 10/5* /(5*3) =3 =3 =3.3333 = =0 =0.5 =6 =0 2.求余运算的对象必须是整型 9%3 1%3 10% %-3 -10% %-3 =0 =1 =1 =1 =-1 =-1

27 §3-3 算术运算与赋值运算-自增自减运算 二、自增自减运算符 运算符(单目 ← ) ++ 自增 14 – – 自减 14
自增 14 – – 自减 14 ++和– –为单目运算,只能作用于变量 只能对int、char、long和指针变量进行运算 功能: ++x <==> x=x+1 – –x <==> x=x–1 (前缀) x++ <==> x=x+1 x– – <==> x=x–1 (后缀)

28 §3-3 算术运算与赋值运算-自增自减运算 自增(自减)有前缀和后缀之分。 前缀形式: 先自增(自减)再引用 后缀形式: 先引用再自增(自减) 前缀与后缀的区别: y=++x; <==> x=x+1; y=x; x先加1再赋值 y=x++; <==> y=x; x=x+1; x先赋值再加1

29 §3-3 算术运算与赋值运算-自增自减运算实例
(1) ++i; i++; 因为在表达式中没有其它运算,结果一样。 (2) x=1; y=++x; 结果: x=2,y=2 y=++x; <==> x=x+1; y=x; 在做赋值运算之前,x先加1,然后将x赋给y (3) x=1; y=x++; 结果: x=2,y=1 y=x++; <==> y=x; x=x+1; 先将 x 赋值给 y ,然后 x 再加1

30 §3-3 算术运算与赋值运算-自增自减运算实例
已知:int x = 2, y = 5, z; z = ++x; z = ++x * ++y; z = x++ * ++y; z = ++x * y++; z = x++ * y++; z = ++x * ++x; x=3, z=3 x=3, y=6, z=3*6=18 x=3, y=6, z=2*6=12 x=3, y=6, z=3*5=15 x=3, y=6, z=2*5=10 x=4, z=4*4=16 注意,以下操作是错误的: x = ++(i+j)+1; j = ++ (5+x); y = ++x * ++x; 逻辑虽然正确 ,但实际编程中容易产生误解,应当避免

31 §3-3 算术运算与赋值运算-自增自减运算实例
已知:int i=1, j=2, k; k=i+++j; C语言处理运算符(标识符)时,遵循自左向右组合的原则,两个‘+’号是一个运算符,故处理成(i++)+j。 k = i+++++j; 不能编译通过。原因是编译器将前两个‘+’处理成自增,接下来又将两个‘+’号处理为自增,故不合语法。 编程者可用空格或括号来表示正确的含义: k=i j; 注意:一般不要用这样的语句。

32 §3-3 算术运算与赋值运算-赋值与赋值组合运算
三、赋值与赋值组合运算符 运算符(双目 ← ) 赋值运算: = 赋值组合运算:e1 op= e 等于于:e1 = e1 op (e2) 其中:op为下列10个运算符之一 + – * / % << >> | & ^ e1为可以进行赋制操作的变量 e2为合法的表达式 例:x += 2; <==> x = x + 2; x *= y+1; <==> x = x * ( y+1); 不等价 x = x * y+1; x >>= 2; <==> x = x >> 2;

33 §3-4 关系运算与逻辑运算 一、关系运算符 运算符(双目运算符 → ) > 大于 >= 大于等于 10 < 小于 <= 小于等于 10 == 等于 9 != 不等于 9 优先级:> >= < <=同级(高),!= ==同级(低) 关系运算的结果应该为逻辑型“真”或“假” C语言中没有逻辑型,将逻辑型数值化处理, 用整型1表示“真”,用整型0表示“假”。

34  如何判断数学中的逻辑关系:0≤a≤9? ? §3-4 关系运算与逻辑运算-关系运算实例 实例
逻辑表达式 7>5 的值是 1,5>7 的值是 0。 已知:int a=13, b=2, c=1; a>b a<=b a!=b a==b (a>b)==c a>b==c a-b==c 成立, 结果为 1 不成立,结果为 0 不成立,结果为 0 结果为 1 与上面等价,结果为 1 等价于(a-b)==1,结果为 0 如何判断数学中的逻辑关系:0≤a≤9? 0<=a<=9 等价于(0<=a)<=9 结果恒为1

35 §3-4 关系运算与逻辑运算-逻辑运算 二、逻辑运算符 运算符 && 逻辑与(双目) 5 (→) ¦¦ 逻辑或(双目) 4 (→)
&& 逻辑与(双目) (→) ¦¦ 逻辑或(双目) (→) ! 逻辑非(单目) (←) 逻辑运算关系 逻辑运算真值表 a b !a !b a&&b a||b

36 §3-4 关系运算与逻辑运算-逻辑运算 实例:比较下列两个逻辑表达式的执行过程 式1 y ¦¦ b && y ¦¦ a 结果 结果 式2 ( y ¦¦ b ) && ( y ¦¦ a ) 结果 结果 例:要判断 0≤ x ≤9 是否成立: ( 0 <= x ) && ( x <= 9 ) 如果没有括号:0 <= x && x <= 9 等价

37 功能:如果表达式e1成立(e1值为非0),则执行表达式e2;否则(表达式e1不成立),执行表达式e3
§3-4 关系运算与逻辑运算-条件运算 三、条件运算符 运算符(三目 ← ) e1 ? e2 : e3 功能:如果表达式e1成立(e1值为非0),则执行表达式e2;否则(表达式e1不成立),执行表达式e3 判断e1 ? 执行e2 执行e3 成立 不成立 例:max = (a>b) ? a : b; 求变量a与b的最大值 min = (a<b) ? a : b; 求变量a与b的最小值

38 §3-5 位运算 运算符 >> 按位右移(双目) 11 (→) << 按位左移(双目) 11 (→)
>> 按位右移(双目) 11 (→) << 按位左移(双目) 11 (→) & 按位与 (双目) 8 (→) ∧ 按位异或(双目) 7 (→) ¦ 按位或 (双目) 6 (→) ∼ ~ 按位反 (单目) 14 (←) 真值表 a b a∧b ~a ~b

39 §3-5 位运算-实例 2 ( & = 0010) 1 ( & = 0001) 15 ( ¦ = 1111) 11 ( ¦ = 1011) 13 ( ^ = 1101) –8 ( ~ ) = –7 28 ( << 2 = ) 2 ( >> 2 = ) 1 ( >> 2 = ) 实例:已知:int x=7,y=10,z=1; 设字长为8位 x&y = x&z = x ¦ y = y ¦ z = x ^y = ~ x = – x = x<<2 = y>>2 = x>>2 =

40 §3-5 位运算-实例 说明 关于>>:右移一位 = 缩小 1/2 关于<<:左移一位 = 扩大 2 倍 关于~: 因为: ~ x = 按位求反 = 求反运算 求负 = 求补 = 求反 + 1 所以: 求反 = 求负 – 1 ~ x = -x -1 ~7 = –8 ~(–8) = 7 注意: 1.位运算是对二进制的位进行运算 2.只能对int型、char型和long型进行位运算

41 §3-6 其它运算 一、指针运算符 运算符(单目 ← ) & 取变量的地址 * 取指针变量(所指向)的内容 14 注意: 运算符 & 和“位与”运算是同一符号; 运算符 * 和“乘”运算是同一符号。 只能从程序的上下文来区分运算符 & 和运算符 * 的实际意义。

42 若px已经指向x,则可以用 *px 代替变量 x
§3-6 其它运算-指针运算实例 实例:已知:int x=2, y, *px; x为一般变量,px为指针型变量 px x 2 10 px = &x; 取变量x的地址赋值给指针px 又称为让px指向变量x x=10; <==> *px = 10; 也称为间接访问 y=x; <==> y = *px; 取指针px的内容 <==> y = *px * 100; <==> x = y * 10; <==> ++ * px <==> (* px)++; 括号不能省略 y=x * 100; *px=y*10; ++x; x++; 若px已经指向x,则可以用 *px 代替变量 x

43 (type) e 将e的数据类型强制转换为type 14 sizeof (opr) 求opr所占用的内存的字节数 14
§3-6 其它运算-其它运算符 二、其它运算符 运算符 取结构/联合的成员 15 –> 通过指针取结构/联合的成员 15 ( ) 改变表达式中的优先级关系 15 [ ] 数组下标 , 逗号,表达式从左向右顺序计算 1 (type) e 将e的数据类型强制转换为type 14 sizeof (opr) 求opr所占用的内存的字节数 14 第十一章 第七章

44 §3-6 其它运算-其它运算实例 实例: 已知:int x,y,z; y = ( x=10, x+1); 答案:先执行x=10,然后再执行y = x+1 y=11, x=10 z = sizeof(int); 答案:z=2 求int型数据占用的内存字节数量 z = sizeof(x); 答案:z=2 求变量x占用的内存字节数量

45 运算符的优先级与结合性 按运算符的优先级分为15级 按运算符的结合性分为2种 自左向右结合 自右向左结合 优先级不同时:运算符优先级的高低决定了进行运算的先后次序。 优先级相同时:同优先级运算符的运算次序由结合性决定。 例如:四则运算中的“先乘除,后加减”反映了运算符的优先级;“同级运算从左至右”反映了乘/除运算(加/减运算)的结合性。

46 运算符的优先级与结合性 运算符优先级表

47 运算符的优先级与结合性-实例 已知:int a=8, b=5, c=2; 计算下列表达式结果 ① a / b * b ② a %b * c ③ a * c >> 2 ④ a & c && b ⑤ a | b & c ⑥ ~ ( ~ a >> 3) ⑦ b > ~ a ? a * c : a % c 5 先 / 后 * 6 先 % 后 * 4 先 * 后 >> 0 先 & 后 && 8 先 & 后 | ~ 后 >> ~ = >>3= ~= 16 先 ~ 再 > 再 ? :

48 §3-7 混合运算及数据类型转换 不同数据类型的数据/变量进行混合运算时,需要进行数据类型转换 转换方式有两种: “显式的”类型转换 “隐式的”类型转换 “显式的”类型转换采用强制类型转换运算符(type) “隐式的”类型转换是C语言按照一定的类型转换规则自动进行的转换

49 §3-7 混合运算及数据类型转换 “隐式的”类型转换规则 1、运算中将所有char型数据都转换成int型,float型转换成double型。 2、低级类型服从高级类型,并进行相应的转换 double float long unsigned int char 3、赋值运算以赋值运算符左边变量的类型为准,即赋值运算符右端值的类型向左边变量的类型看齐,并进行相应的转换。

50 §3-7 混合运算及数据类型转换-实例 例:int a,j,y; float b; long d; double c; 则: y = j + 'a' + a * b - c / d; 其运算次序和隐含的类型转换为: ①计算a*b,运算结果为double型。 ②再计算c/d,结果为double型。 ③计算j+'a',结果为整型。 ④将第1步和第3步的结果相加,结果为double型 ⑤用第4步结果减第2步结果,结果为double型 ⑥给y赋值,先将第5步的结果double型转换为整型(因为赋值运算左边变量y为整型),截掉double型数据的小数部分,压缩成int型。

51 §3-8 综合举例 1、运算符有优先级,在C语言中关于运算符优先级的正确叙述是 。 A) 逻辑运算符高于算术运算符,算术运算符高于关系运算符 B) 算术运算符高于关系运算符,关系运算符高于逻辑运算符 C) 算术运算符高于逻辑运算符,逻辑运算符高于关系运算符 D) 关系运算符高于逻辑运算符,逻辑运算符高于算术运算符 答案:B

52 §3-8 综合举例 2、在以下关于C语言的不严格的叙述中,错误的是 A)大写字母和小写字母的意义相同
B)有些不同类型的变量可以在一个表达式中运算 C)在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D)同一个运算符号在不同的场合可以有不同的含义 答案:A 3、C语言中的简单数据类型包括 。 A)整型、实型、逻辑型 B)整型、实型、字符型 C)整型、字符型、逻辑型 D)整型、实型、逻辑型、字符型 答案:B

53 7、已知:int a=4,b=5,c;则执行表达式“c=a=a>b”后变量a的值为 。 A) 0 B) 1 C) 4 D) 5
§3-8 综合举例 4、在C语言中,错误的int类型的常数是 。 A) B) C) D) 0xAF 答案:A 5、下列常数中不能作为C的常量的是 。 A) 0xA B) 2.5e-2 C) 3e2 D) 0582 答案:D 6、在C语言中,十进制的47可等价地写为 。 A) 2f B) 02f C) D) 057 7、已知:int a=4,b=5,c;则执行表达式“c=a=a>b”后变量a的值为 。 A) 0 B) C) D) 5

54 ch=(ch>=’A’&&ch<=’Z’)?(ch+32):ch;
§3-8 综合举例 8、下列可以正确表示字符型常数的是 A) "a" B) ’\t’ C) "\n" D) 297 答案:B 9、以下错误的转义字符是 A) ’\\’ B) ’\’’ C) ’\81’ D) ’\0’ 答案:C 10、已知:float x=1,y;则:y=++x*++x的结果是 A) y=9 B) y=6 C) y=1 D) 表达式是错误的 答案:D 11、已知:char ch=’A’;则下列表达式的值是 ch=(ch>=’A’&&ch<=’Z’)?(ch+32):ch; A) A B) a C) Z D) z

55 §3-8 综合举例 12、字符串"\\\22a,0\n"的长度是 。 A) 8 B) 7 C) 6 D) 5 答案:C
13、在程序中要使用语句:printf("%s\n", STRING); 输出一个长度为5个字符的提示信息"OK!",则应使用宏定义语句______。 A) #define STRING "OK!" B) #define STRING ""OK!"" C) #define STRING \"OK!\" D) 以上三个答案都是错误的 答案:D #define STRING "\"OK!\""

56 §3-8 综合实例 main( ) { int x,y,z; x=y=z=2; ++x||++y&&++z; printt(x,y,z);
#define printt(x,y,z) printf("x=%d, y=%d, z=%d\n",x,y,z) main( ) { int x,y,z; x=y=z=2; ++x||++y&&++z; printt(x,y,z); x=y=z=2; ++x&&++y||++z; printt(x,y,z) x=y=z=2; ++x&&++y&&++z; x=y=z=-2;++x||++y&&++z; x=y=z=-2;++x&&++y||++z; x=y=z=-2;++x&&++y&&++z; } 例C3_16 x=3, y=2, z=2 x=3, y=3, z=2 x=3, y=3, z=3 x=-1,y=-2,z=-2 x=-1,y=-1,z=-2 x=-1,y=-1,z=-1

57 实例 #define PRINT(x) printf("%d\n", x) main ( ) { int x=3, y=2, z=1;
x = y++ >= x && x - y == ++z; PRINT(x); PRINT(y); PRINT(z); y *= z = x+(z+2); x = y = z = 1; PRINT (--x && ++y || z++); x=9; y=6; z=5; x = (( x + y ) % z >= x % z + y % z ) ? 1: 0; PRINT(x); } 例C3_20 /* 先算y>=x结果为0,则不再 算&&之后的表达式x-y==++z。将结果赋给x,最后执行y+1 */ /* x=0, y=3, z=1 */ /* 先算x+(z+2),3赋给z,再执行y*=z */ /* x=0, y=9, z=3 */ /* x先减1结果为0,则跳过&&++y 不执行,与z进行逻辑或运算,再执行z++,输出结果:1 */ /* x=0, y=1, z=2 */ /* ┃①┃ ┃ ┃③┃ ┃④┃ ━┳━ */ /* ┗┳┛ ② ┃ ┗┳┛⑤┗┳┛  ┃ */ /* ┗━┳━┛ ⑥ ┗━┳━┛ ┃ */ /*  ┗━━━┳━━━┛ ⑦ ┃ */ /* ┗━━━━━━━━━┛ */ /* x=0 */

58 实例 #include <stdio.h> main ( ) {int x, y, z; x=1; y=1; z=0;
x = x &&y||z; printf("x=%d\n",x); printf ("%d\n", x || !y++ && ++z); printf ("y=%d, z=%d\n", y, z); x = y = 1; z = x++ -1; printf ("x=%d, z=%d\n", x, z); z += -x y; printf ("x=%d, y=%d, z=%d\n", x, y, z); } 例C3_21 &&优先级高,先计算x&&y,结果为1 由于是||运算,故不再计算1||z。x=1 ||优先级最低,x=1,不再计算||右边的算式,y和z不变 y=1, z=0 ++为后缀,先将x-1的值赋给z,再计算x++ x=2, z=0 等价于z+=(-(x++))+(++y) x=3, z=0, y=2


Download ppt "数据类型与运算规则."

Similar presentations


Ads by Google