1 / 60

第 6 章 数据类型和表达式

第 6 章 数据类型和表达式. 数据类型 : 对某些具有共同特点的数据集合的总称. 各种数据在内存的存储方式 ( 书写形式 ) 、数的表示范围. 整型 实型 字符. 单精度型 双精度. 基本类型. 数组 结构 联合 枚举. 数据类型. 构造类型. 指针类型 空类型. 表达式 :. 用运算符将运算对象及括弧按语法规则 连接起来 的式子. § 6.1 基本数据类型和数据的存储. 6.1.1 整型(整数) 1. 整型类型  基本类型 int. ANSI C(TC) VC++. 2 个字节 16 位.

Download Presentation

第 6 章 数据类型和表达式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第6章 数据类型和表达式 数据类型:对某些具有共同特点的数据集合的总称 各种数据在内存的存储方式(书写形式)、数的表示范围 整型 实型 字符 单精度型 双精度 基本类型 数组 结构 联合 枚举 数据类型 构造类型 指针类型 空类型 表达式: 用运算符将运算对象及括弧按语法规则连接起来的式子

  2. §6.1基本数据类型和数据的存储 6.1.1整型(整数) 1.整型类型 基本类型 int ANSI C(TC) VC++ 2个字节 16位 4个字节 32位 例 int ai,bi,ci; 扩展类型 短整型 short 长整型 long 2个字节 16位 4个字节 32位 2个字节 16位 4个字节 32位 unsigned int 或 unsigned unsigned short unsigned long 以及无± 运算符sizeof (2级)可以求出数据类型、常量、变量的字节数 如 sizeof(long)4 sizeof(e)4 例 unsigned short c,d; long e,f ; 差别: 数据存储单元的字节数多少? 1字节为8位二进制位

  3. 同理 unsigned short 取值范围 在 0 ~65535 int、long (32位)取值范围 -2147483648 ~ 2147483647 unsigned int、unsigned long (32位)取值 0 ~ 4294967295 2.整型数的取值范围 以short(16位)为例: + 1 + 0 - 1 符号位 最大值 由于负数补码表示,最小值 -32768 所以 -32768 ~ 32767

  4. 注:数据不能超过表达范围 设int定义的变量为2个字节,下面程序段输出结果是_______。 int i=65536;printf("%d\n",i); A、65536 B、0 C、语法错误,无输出结果 D、-1 6553610= 2000008= 10,000,000,000,000,000 则 i= 答案 B

  5. 原代码、反码、补码的概念 原代码 存储单元的最高位作为符号,其0为正,1为负,值为二进制 例 -5 10000101 (设存储单元为一个字节) 计算机带符号运算实现起来十分复杂,一般都作为无符号运算,采用补码运算。 补码 补码=X+K 其中 X 带符号的数 K 为模,比存储单元多一位,最高位为 1,其余位均为0 如 K=100000000 (设存储为1个字节) 注X+K运算后K的最高位不存在,因为只有规定的存储位数

  6. 例 求 +13 的补码 +13 的补码 =00001101+100000000=100001101=00001101 结论 正数的补码=原代码 例 求 -13的补码 -13 的补码 = -00001101+100000000=11110011 按上述方法求负数的补码比较麻烦,一般利用反码求解 反码 代码的0变为1,1变为0 利用反码求解负数的补码公式为 补码=反码+1 例 -13的原代码=10001101 -13的反码= 11110010 -13的补码= 11110011 注:符号位不参加反码运算。

  7. short(16位)的最小值-32768,其存储表示: -32767的原代码=11111111 11111111 反码=10000000 00000000 补码=10000000 00000001 因此 -32768= -32767-1 -32768的补码=10000000 00000000

  8. 例下列程序的输出结果是____。 #include <stdio.h> void main( ) { int x,k; x=12; for(k=0;x!=0;x=x+2) k=k+1; printf(“k=%d,x=%d\n”,k,x); } 按ANSI C int为2字节16位, 取值范围-32768 ~ 32767 答案k=32762,x=0 x=-32768+2=-32766 ..... x=-2+2=0 则k的值即为循环次数计算 x正值循环次数: (32766-12)/2=16377 x负值循环次数: 32768/2=16384 x=32766到x=-32768 1次 k=16377+16384+1=32762 x=12 x=12+2=14 x=14+2=16 ...... x=32766+2=-32768 (32766+1=01111111 11111111 32767+1=10000000 00000000 -32768的补码=10000000 00000000)

  9. 指数符号 数值符号 7位指数值 23位小数值 6.1.2实型(浮点数) 1.实型类型 单精度 float 4个字节 32位 双精度 double 8个字节 64位 例如 float x,y ; double a,b ; 2.数的取值范围 以float(4个字节)为例 所有实型数以二进制规格化浮点形式存储: ±0.××...×e±××

  10. 求最大值,此时指数、小数位全为“1” 1111111 指数值 + 1 10000000 小数值 .1111111...1 + 1 1.0 则 同理最小值 所以取值范围 ±(10-38 ~ 1038) 同理 double型8个字节、指数位10位、小数位52位 所以取值范围 ±(10-308 ~ 10308)

  11. 3.有效位数 十进制 0 1 2 3 4 5 6 7 8 9 二进制 000 001 010 011 100 101 110 111 1000 1001 由此可判断 3~4位二进制可以表示1位十进制 float 23/3~4 一般称为 7~8 位 double 52/3~4 15~16位 注 在使用实型数要注意有效位数 如 float a ; a=1234567.89; 语法不错,但a= 1234567.875,只接受前8位有效值

  12. 6.1.3字符型 1.字符类型 char 1个字节 8位 例如 char ch; 2.存储形式 所有数据以二进制形式存储,字符数据不能例外 字符数据以ASCII编码存储,存储形式同整型数据int,但1字节 例 字符 10进制 8进制 2进制 a 的ASCAII编码 97 141 01100001 b 的ASCAII编码 98 142 01100010 1 的ASCAII编码 49 61 00110001

  13. §6.2常量和变量 每种数据类型有常量和变量 6.2.1 常量 常量:在程序运行过程中,其值不能被改变 1.符号常量 用一个标识符代表一个常数。 格式#define 标识符 常数 其中 标识符:字符序列,字母、数字符和底划线组成 第一个字符必须是字母或底划线 字符长度不限,但长度>8时只认前8个 如 #define PI 3.14

  14. 例6-1 输入球的半径,计算球的表面积和体积。 #define PI 3.14 #include <stdio.h> main() {float r,s,v; scanf("%f",&r); s=4.0*PI*r*r; v=4.0/3.0*PI*r*r*r; printf("s=%f,v=%f\n",s,v); } s=4.0*3.14*r*r; v=4.0/3.0* 3.14 *r*r*r; 注使用符号常量的好处是修改方便,便于移植,。 例如在例6-1增加的精度 #define PI 3.1415926 增加程序的可读性,符号常量可以见名知义。 定义符号常量标识符一般使用大写字母,与定义变量名区别

  15. 2.整型常量(整数) (1)整数表示 十进制:如 123、-456、0 与日常习惯同 八进制: 0123、-011 以0先导,以0~7构成 16进制: 0x123、-0x11 以0x先导,以0~9和A~F或a~f构成 任何一个整数都可以用3种形式来表示, 例如 10、012、0xa 它们的数值相同。 在内存均以二进制存储: 00001010

  16. 例如 17510=2578 例如0.82510=0.6463...8 余数 7 5 8 175 0.825 × 8 21 8 2 6.600 × 8 读数 4.8 × 8 读数 6.4 × 8 3.2 (2)数制转换 十进制 →八进制 整数转换:除8取余 小数转换:乘8取整 一般数转换: 整数、小数分别转换, 然后合写 例如 175.82510=2578+0.6463...8=257.6463...8

  17. 八进制与二进制转换 3位二进制表示一位八进制,对应关系: 八进制 0 1 2 3 4 5 6 7 二进制 000 001 010 011 100 101 110 111 由此可知 八→二:以小数点为界,一位拉三位 二→八:以小数点为界,三位合 一位 如 257.64638=10101111.1101001100112 十进制 → 16进制 十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16进制 0 1 2 3 4 5 6 7 8 9 a b c d e f 整数转换:除16取余 小数转换:乘16取整 如 175.82510=af.d3333...16

  18. 二进制与16进制转换 16进制 0 1 2 3 4 5 6 7 8 9 a b c d e f 二进制 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 由此可知 16→二:以小数点为界,一位拉四位 二→16:以小数点为界,四位合 一位 二、八、16 进制→十进制 直接将数值用多项式展开,计算而得. 例如

  19. (3)整数的类型 (1)根据数据计算机自动给定整型常量的类型,按最少字节数为原则 例 123 、-567 short 50000 unsigned short -50000 long (int) (2)用L或l在数据的尾部强制定义long型 用U或u在数据的尾部强制定义unsigned型 用LU或lu在数据的尾部强制定义unsigned long型 例 123L、 0L long 12u 、 034u 、 0x2fdu unsigned 4294967295lu unsigned long 判断整数的类型次序: 先根据整数后的字母,如果没有字母,再根据值的大小

  20. 3.实型常数(实数) 实型数(又称浮点数):带小数点的数,只能表示十进制数 (1)实数的表示 基本型(浮点数) 格式 ±a.b ±.b ±a . 其中 a、b 是若干位十进制数0~9 ,“+”可省略。 例如 123.0 0.123 .123 123. 指数型(科学记数法) 1.210-5 → 1.2e-5 或 1.2E-5 如 格式±a.bE±d ±.bE±d ±a.E±d ±aE±d 其中 a、b 是若干位十进制数0~9,d为1~3位 十进制数, “+”可省略。 例如 123.123e-5 .123e-1 -123.E-2 123E2 (2)实常数的类型均为doulbe

  21. 4字符型常量 (1)单个字符,用单引号括起的单个字符 格式 '单个字符' 例 'A' 、'a' (2)使用转义字符 \ 表示 格式 '\单个字符'或 '\数字' 参见表6-3 \n 换行 \t 横向跳格 \v 竖向跳格 \\ 反斜杠\ \'单引号 \" 双引号 \ddd 1~3位八进制\xhh 1~2位16进制 例 A 65(+) 101(八)41(16)'\101'='A'或 '\x41'='A' 换行 10(+) 12 (八)'\012' = '\n' 或 '\12'='\n'

  22. 6.2.2 变量 变量:在程序运行过程中,其值可以被改变 1.变量定义 类型名 变量名表; 例如: int a, b; char ch; double x, y; 定义变量做了3件事:变量取名、确定数据类型、分配内存 注变量在使用之前必须定义。 变量定义的位置在函数体的说明部分 选择变量类型根据存储数据形式、数值范围、有效位确定

  23. 2.变量赋初值 定义变量的同时当即给变量赋值 格式 类型关键字 变量名=数据; 例 int a=3; 相当于 int a; a=3 float f=3.56; 相当于 float f; a=3.56 char c= 'a' 相当于 char c; a= 'a' double x,y,z=5; 相当于 double x,y,z; z=5; 注 变量在引用之前必须先赋值。

  24. §6.3数据的输入和输出 数据输入:通过外设将数据输入内存。 数据输出:将内存的数据通过外设输出。 输入和输出通过调用函数实现 输出函数:printf(格式控制,输出表列); putchar(输出字符); 仅用于字符型 输入函数:scanf(格式控制,地址表列); getchar() 仅用于字符型 格式控制由%格式符和普通字符构成 %格式符:控制数据输入/输出的类型 普通字符:输出,照原样输出 输入,作为数据的分隔符,输入数据时同时输入 %格式符与表列数据的个数、类型、位置必须一一对应

  25. 6.3.1 整型格式符 输出时可以域宽控制: %md 、 %mo、 %mx %-md 、 %-mo、 %-mx m为正整数, 指定输出长度(包含符号位)。 若数据位数小于m, 若无-号,则数据按右对齐,左端补上空格。 若有-号,则数据按左对齐,右端补上空格。 若数据位数大于m,数据按实际位数输出

  26. 例6-2 #include <stdio.h> void main( ) { printf("%d,%o,%x\n",10,10,10); } 输出: 10,12,a 例 # include <stdio.h> void main( ) {int a, b; printf("input a, b:"); scanf("%o%d", &a, &b); printf("%d%d\n", a, b); } input a, b: 17 17 15 17

  27. | 1 2 3 4 5 6 7 8 9 ---------------------------------------------------- 1| 1 2 3 4 5 6 7 8 9 2| 2 4 6 8 10 12 14 16 18 3| 3 6 9 12 15 18 21 24 27 4| 4 8 12 16 20 24 28 32 36 5| 5 10 15 20 25 30 35 40 45 6| 6 12 18 24 30 36 42 48 54 7| 7 14 21 28 35 42 49 56 63 8| 8 16 24 32 40 48 56 64 72 9| 9 18 27 36 45 54 63 72 81 例 输出乘法九九表 #include <stdio.h> void main( ) {int i,j; printf(" |"); for(i=1;i<10;i++)printf("%5d",i); printf("\n"); for(i=1;i<=10;i++)printf("-----"); printf("-\n"); for(i=1;i<10;i++) {printf("%5d|",i); for(j=1;j<10;j++)printf("%5d",i*j); printf("\n"); } }

  28. 6.3.2 实型格式符 输出时域宽控制: %m.nf 、 %m.ne %-m.nf 、 %-m.ne m,n为正整数, m输出长度(包含符号和小数点的位),n指定小数位。 若数据位数<m, 若无-号,则数据按右对齐,左端补上空格。 若有-号,则数据按左对齐,右端补上空格。 若数据位数>m,数据按实际位数输出 n缺省,小数为6位。m缺省,数据按实际位数, 注:指数形式 ±0.××...×e±×××

  29. 例 #include <stdio.h> void main() {double d=3.1415926; printf("%f,%e\n",d,d); printf("%10f,%10.2f,%-10.2f,%.2f,%0.f\n",d,d,d,d,d); } 输出3.141593, 3.141593e+000 %f %e 小数6位,整数按实际 小数6位,整数1位,指数3位 输出3.141593, 3.14,3.14 ,3.14,3 %10f %10.2f %-10.2 %.2f %0.f

  30. 6.3.3 字符型格式符 若输入 abc 则输出 a#b#c char %c 表示输入/输出一个字符。 若输入 a b c 则输出 a# #b 例6-3 #include <stdio.h> void main() {char ch1,ch2,ch3; scanf("%c%c%c",&ch1,&ch2,&ch3); printf("%c%c%c%c%c",ch1,'#',ch2,'#',ch3); } 注在%c格式输入时忽略空格分隔符,即不需要分隔符,而空格作 为字符输入。若要输入字符之间空格分隔,则 scanf("%c %c %c",&ch1,&ch2,&ch3); 键入的字符不需单引号

  31. 整型与字符型输入/输出转换 输出 a,97 a,97 例 main() {int i; char c; i='a';c=97; printf("%c,%d\n",c,c); printf("%c,%d\n",i,i); } 解释 A,a的ASCII码分别为 65、97, 两者之差为32,则 大写字母=小写字母-32 小写字母=大写字母+32 所以 'B'='b'-32 或 'B'='b'-('a'-'A') 整型与字符型互换运算 例 main() {char c1,c2; c1='a';c2='b'; c1=c1-32; c2=c2-32; printf("%c %c\n",c1,c2); } 同理 把数字字符c转成数字 c-'0' 如c='5' '5'的ASCII码 53 '0'的ASCII码 48 53-48--->5 输出A B

  32. 字符存储同int,则存储单元的最高位应是符号位字符存储同int,则存储单元的最高位应是符号位 例 字符 十进制 八进制 二进制 按%d输出 a 97 141 01100001 97 ■ 254 376 11111110 -2 (补码 10000010) 解释 由于存储单元的最高位是1,表示为负数,则按补码输出 ASCII为128~255之间的字符均存在此问题 例 main() { char c; c='\376'; printf("%d\n",c); } 输出-2 解决办法使用 unsigned char定义字符变量 例 main() { unsigned char c; c='\376'; printf("%d\n",c); } 输出254

  33. int double double double double §6.4类型转换 不同类型数据的混合运算,由于类型数据存储形式不一样,必须转换为同一类型,才能运算。 高 double ←float ↑ long ↑ unsigned ← unsigned short ↑ 低 int ←char,short 6.4.1 自动类型转换 (1)非赋值运算的类型转换 • 水平方向:自动 • 垂直方向:低  高 例 int i; float f; double d; long e; 10 + 'a' + i * f - d / e

  34. (2)赋值运算的类型转换 变量 = 表达式 当表达式的类型与被赋值的变量不一致时,表达式的值类型自动制转成变量的类型 short a = 1000; char b = 'A'; long c; c = a + b; double x; x = 1; x = 1.0 c = 1065 int ai; ai = 2.56; int bi; bi = 0x12345678L; ai = 2 printf(“%x”,bi); vc: 12345678 tc: 5678 bi = ?

  35. 6.4.2强制类型转换 对表达式的值强制转换 格式(类型关键字) (表达式) 例 (double) a (int) (x+y) (float) (5%3) (int) (10+ 'a' +i*f-d/e) 注括号用法 (int) x+y 仅对x 有效 强制转换仅对表达式的值,原变量的类型不改变 将实型数强制转换成整型,即为取整

  36. §6.5表达式 表达式:用运算符将运算对象及括弧按语法规则连接起来的式子 6.5.1算术表达式 算术运算符: + - 正 负 单目运算 2级 从左到右 + - 加 减 双目运算 4级 从左到右 * / % 乘 除 取余 双目运算 3级 从左到右 ++ -- 自增 自减 单目运算 2级 从右到左

  37. 自增、自减运算 ++ 自增 -- 自减 单目运算 操作 对操作的变量在运算前或后使其值加(自增)或减(自减) 1 如 ++i, --i 在使用i之前先使i的值加(减) 1 i++, i-- 在使用i之后使i的值加(减) 1 例 i=3; ++i; i++; printf("%d",i); 输出 5 可认为 ++i; i++; 相当于 i=i+1 --i; i--; 相当于 i=i-1 但这仅适合自增自减对单个变量操作的表达式,如表达式有其它运算符就不一样了 例 j=++i; 设 i=3 则 j的值为 4 i的值为 4 j=i++; 设 i=3 则 j的值为 3 i的值为 4

  38. 注自增自减 运算对象仅是一个整型变量 如 5++; (a+b)--; 是不允许 ++,--优先级为2级, 从右到左 结合 如 -j++ 理解为 -(j++) j+++k 理解为 (j++)+k + 比++级别低 自增自减 的副作用 C语言中,根据运算符的优先级和结合性决定表达式的计算顺序,但对运算符两侧操作数的求值顺序并未做出明确的规定,不同编译系统采取不同的处理方式。 例 f()+g() 可以 先f(),再g(),最后+ 也可 先g(),再f(),最后+ 但自增自减 将产生歧义性结果。

  39. 如 s=(i++)+(i++)+(i++) 设 i=3 可能 s=3+4+5 也可能 s=3+3+3 ANSI C 得到不同的结果。尽量避免使用。 如果原意得到12,语句可用多句表示 i=3; a=i++;b=i++;c=i++;s=a+b+c; 如 s=(++ i)+(++ i)+(++ i) 设 i=3 ANSI C 可能 s=4+5+6 也可能 s=6+6+6 在ANSI C自增或自减规定: 对表达式中变量前的自增或自减,整个表达式计算之前完成计算 对表达式中变量后的自增或自减,整个表达式计算完成后再计算

  40. 6.5.2赋值表达式 1.赋值运算符 = 赋值运算 双目运算 14级 从右到左 格式 变量=表达式 计算表达式的值 将表达式的值赋给变量 将变量的值作为赋值表达式的值 操作 例 a=5 a=b=5 相当于 a=(b=5) a=(b=4)+(c=6) 得 a=10,b=4,c=6 注:当表达式的类型与被赋值的变量不一致时,表达式的值类型强制转成变量的类型

  41. 2.复合赋值运算符 格式 <算术运算符> = += 加赋值 x+=exp 等价于 x=x+exp -= 减赋值 x-=exp 等价于 x=x-exp *= 乘赋值 x*=exp 等价于 x=x*exp /= 除赋值 x/=exp 等价于 x=x/exp %= 取余赋值 x%=exp 等价于 x=x%exp 例 a+=3 等价于 a=a+3 x*=y+8 x=x*(y+8) x%=3 x=x%3 注赋值运算符的优先级为14级,运算从右到左 例 a+=a- =a*a 等价于 a+=(a=a-a*a)  a=a+(a=a-a*a)  a=a-a*a; a=a+a;

  42. 6.5.3 关系表达式 关系运算符 < 小于 < = 小于或等于 > 大于 > = 大于或等于 = = 等于 ! = 不等于 6级 从左到右 双目运算 7级 6.5.4 逻辑表达式 逻辑运算符 && 逻辑与 11级 | | 逻辑或 12级 ! 逻辑非 2级 双目运算 从左自右 单目运算 从右自左

  43. 1 1 1 3 1 0 1 注关系运算符连写无意义 如 x>y>z 应为 x>y&&y>z • 逻辑运算操作数可以是任意类型的数据,对非1或0的数据在 进行逻辑运算之前转换成 1 或 0 ,非0数都转成1。 例5>3 && 2 | | 8 < 4 - ! 0

  44. 逻辑表达式从左到右的顺序计算运算符两侧的操作数,一旦已经能明确答案了,剩余计算就不再做了。逻辑表达式从左到右的顺序计算运算符两侧的操作数,一旦已经能明确答案了,剩余计算就不再做了。 如 exp1&&exp2 当计算exp1为0时,exp1&&exp2的值一定是0。对exp2就不再计算 例 设x=5,y=5,z=0 计算x&&z&&(y=1) x&&z&&(y=1) • 0 • x=5 y=5 z=0 又如 exp1||exp2 当计算exp1为1时,exp1&&exp2的值一定是1。对exp2就不再计算

  45. 逻辑表达式的等价关系 x x==0 !x 非0 0 0 0 1 1 x==0和!x等价 !(x==0&&y==0)、x!=0||y!=0和x||y等价 x y !(x==0&&y==0) x!=0||y!=0 x||y 非0 非0 1 1 1 非0 0 1 1 1 0 非0 1 1 1 0 0 0 0 0 表达式x&&1等价于( )。 A.x==0 B.x==1 C. x!=0 D.x!=1 答案:C x x&&1 A)x==0 B)x==1 C) x!=0 D) x!=1 0 0 1 0 0 1 非0 1 0 0 1 0

  46. 6.5.5 条件表达式 格式 表达式1?表达式2:表达式3 0 表达式1 其中 ?与 : 是运算符,唯一的三目运算符 非0 操作 先计算表达式1,若表达式1的为非0 ,则计算表达式2的值作为条件表达 式的值;否则计算表达式3的值作为 条件表达式的值。 表达式2 表达式3 例如 设a、b是整型变量,将a、b的最大值赋给z。 if语句: 条件表达式: if(a>b) z=a else z=b; z=(a>b)?z=a:z=b;

  47. 注1.条件表达式运算符?和:的计算优先级为13级,从右至左结合注1.条件表达式运算符?和:的计算优先级为13级,从右至左结合 例 max=((a>b)?a:b) max=(a>b)?a:b max=a>b?a:b 均等价 例 a>b?a:c>d?c:d 等价于 a>b?a:(c>d?c:d) 2.条件表达式中的三个表达式的类型可以不同,但表达式的值 取表达式2与表达式3的高者类型 例 x>y?1:1.5 得到是实型 3条件表达式中自增、自减的计算的次序 执行下列程序后,a的值为: int a,b; a=15;b=12; a=(a--= =b++)?a/5:a%5; A) -1 B) 3 C) 4 D) 0 15==12--->0 a-- a=14 b++ b=13 a%5 14%5--->4 答案C

  48. 4.使用条件表达式描述某些函数,语句非常简练 例(a>b)?a:b 表示为 max(a,b) (a>0)?a:-a 表示为 |a| a>0?1:(a<0?-1:0) 表示为 sign(a) a>b?(a>c?a:c):(b>c?b:c) max(a,b,c) 简单的if语句程序用条件表达式来实现更为方便 例 计算分段函数 if(x<=1) f=exp(x); else f=x*x-1; f=(x<=1)?exp(x): x*x-1; 例 小写字母转换大写字母 if(ch>='a'&&ch<='z') ch=ch-'a'+'A'; (ch>='a'&&ch<='z')?ch=ch-'a'+'A':ch;

  49. 6.5.6 逗号表达式 格式 表达式1,表达式2,..表达式n 用逗号将各表达式分割,整个式子称为逗号表达式 其中逗号是运算符,其优先级为最低级(15级),从左到右计算表达式 最后的表达式n的值作为逗号表达式的整体值 例 3+5,6+8 得 14 a=3*5,a*4 60 x=(a=3,6*3) 18 x=18 注 不是任何地方出现的逗号都作为逗号运算符 例 函数参数之间使用逗号分割 printf("%d,%d,%d",a,b,c); a,b,c 不是逗号表达式 printf("%d,%d,%d",(a,b,c),b,c); (a,b,c)是逗号表达式 函数参数从右到左计算 例 i=1;printf(“%d %d %d”,i,i=i+1,i=i+1); 输出 3,3,2

  50. 逗号表达式的用途 1.逗号表达式简化复合语句 #include <stdio.h> void main( ) {int a,b,t; printf("input a, b: "); scanf("%d%d", &a, &b); if(a<b) {t=a;a=b;b=t;} printf("%d %d", a,b); } if(a<b) t=a,a=b,b=t; 2.逗号表达式用于for的循环表 sum=0; for(i=0;i<=100;i++) sum=sum+i; for(i=0,sum=0;i<=100; i++) sum = sum + i;

More Related