600 likes | 761 Views
第 6 章 数据类型和表达式. 数据类型 : 对某些具有共同特点的数据集合的总称. 各种数据在内存的存储方式 ( 书写形式 ) 、数的表示范围. 整型 实型 字符. 单精度型 双精度. 基本类型. 数组 结构 联合 枚举. 数据类型. 构造类型. 指针类型 空类型. 表达式 :. 用运算符将运算对象及括弧按语法规则 连接起来 的式子. § 6.1 基本数据类型和数据的存储. 6.1.1 整型(整数) 1. 整型类型 基本类型 int. ANSI C(TC) VC++. 2 个字节 16 位.
E N D
第6章 数据类型和表达式 数据类型:对某些具有共同特点的数据集合的总称 各种数据在内存的存储方式(书写形式)、数的表示范围 整型 实型 字符 单精度型 双精度 基本类型 数组 结构 联合 枚举 数据类型 构造类型 指针类型 空类型 表达式: 用运算符将运算对象及括弧按语法规则连接起来的式子
§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位二进制位
同理 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
注:数据不能超过表达范围 设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
原代码、反码、补码的概念 原代码 存储单元的最高位作为符号,其0为正,1为负,值为二进制 例 -5 10000101 (设存储单元为一个字节) 计算机带符号运算实现起来十分复杂,一般都作为无符号运算,采用补码运算。 补码 补码=X+K 其中 X 带符号的数 K 为模,比存储单元多一位,最高位为 1,其余位均为0 如 K=100000000 (设存储为1个字节) 注X+K运算后K的最高位不存在,因为只有规定的存储位数
例 求 +13 的补码 +13 的补码 =00001101+100000000=100001101=00001101 结论 正数的补码=原代码 例 求 -13的补码 -13 的补码 = -00001101+100000000=11110011 按上述方法求负数的补码比较麻烦,一般利用反码求解 反码 代码的0变为1,1变为0 利用反码求解负数的补码公式为 补码=反码+1 例 -13的原代码=10001101 -13的反码= 11110010 -13的补码= 11110011 注:符号位不参加反码运算。
short(16位)的最小值-32768,其存储表示: -32767的原代码=11111111 11111111 反码=10000000 00000000 补码=10000000 00000001 因此 -32768= -32767-1 -32768的补码=10000000 00000000
例下列程序的输出结果是____。 #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)
指数符号 数值符号 7位指数值 23位小数值 6.1.2实型(浮点数) 1.实型类型 单精度 float 4个字节 32位 双精度 double 8个字节 64位 例如 float x,y ; double a,b ; 2.数的取值范围 以float(4个字节)为例 所有实型数以二进制规格化浮点形式存储: ±0.××...×e±××
求最大值,此时指数、小数位全为“1” 1111111 指数值 + 1 10000000 小数值 .1111111...1 + 1 1.0 则 同理最小值 所以取值范围 ±(10-38 ~ 1038) 同理 double型8个字节、指数位10位、小数位52位 所以取值范围 ±(10-308 ~ 10308)
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位有效值
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
§6.2常量和变量 每种数据类型有常量和变量 6.2.1 常量 常量:在程序运行过程中,其值不能被改变 1.符号常量 用一个标识符代表一个常数。 格式#define 标识符 常数 其中 标识符:字符序列,字母、数字符和底划线组成 第一个字符必须是字母或底划线 字符长度不限,但长度>8时只认前8个 如 #define PI 3.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 增加程序的可读性,符号常量可以见名知义。 定义符号常量标识符一般使用大写字母,与定义变量名区别
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
例如 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
八进制与二进制转换 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
二进制与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 进制→十进制 直接将数值用多项式展开,计算而得. 例如
(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 判断整数的类型次序: 先根据整数后的字母,如果没有字母,再根据值的大小
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
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'
6.2.2 变量 变量:在程序运行过程中,其值可以被改变 1.变量定义 类型名 变量名表; 例如: int a, b; char ch; double x, y; 定义变量做了3件事:变量取名、确定数据类型、分配内存 注变量在使用之前必须定义。 变量定义的位置在函数体的说明部分 选择变量类型根据存储数据形式、数值范围、有效位确定
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; 注 变量在引用之前必须先赋值。
§6.3数据的输入和输出 数据输入:通过外设将数据输入内存。 数据输出:将内存的数据通过外设输出。 输入和输出通过调用函数实现 输出函数:printf(格式控制,输出表列); putchar(输出字符); 仅用于字符型 输入函数:scanf(格式控制,地址表列); getchar() 仅用于字符型 格式控制由%格式符和普通字符构成 %格式符:控制数据输入/输出的类型 普通字符:输出,照原样输出 输入,作为数据的分隔符,输入数据时同时输入 %格式符与表列数据的个数、类型、位置必须一一对应
6.3.1 整型格式符 输出时可以域宽控制: %md 、 %mo、 %mx %-md 、 %-mo、 %-mx m为正整数, 指定输出长度(包含符号位)。 若数据位数小于m, 若无-号,则数据按右对齐,左端补上空格。 若有-号,则数据按左对齐,右端补上空格。 若数据位数大于m,数据按实际位数输出
例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
| 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"); } }
6.3.2 实型格式符 输出时域宽控制: %m.nf 、 %m.ne %-m.nf 、 %-m.ne m,n为正整数, m输出长度(包含符号和小数点的位),n指定小数位。 若数据位数<m, 若无-号,则数据按右对齐,左端补上空格。 若有-号,则数据按左对齐,右端补上空格。 若数据位数>m,数据按实际位数输出 n缺省,小数为6位。m缺省,数据按实际位数, 注:指数形式 ±0.××...×e±×××
例 #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
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); 键入的字符不需单引号
整型与字符型输入/输出转换 输出 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
字符存储同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
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
(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 = ?
6.4.2强制类型转换 对表达式的值强制转换 格式(类型关键字) (表达式) 例 (double) a (int) (x+y) (float) (5%3) (int) (10+ 'a' +i*f-d/e) 注括号用法 (int) x+y 仅对x 有效 强制转换仅对表达式的值,原变量的类型不改变 将实型数强制转换成整型,即为取整
§6.5表达式 表达式:用运算符将运算对象及括弧按语法规则连接起来的式子 6.5.1算术表达式 算术运算符: + - 正 负 单目运算 2级 从左到右 + - 加 减 双目运算 4级 从左到右 * / % 乘 除 取余 双目运算 3级 从左到右 ++ -- 自增 自减 单目运算 2级 从右到左
自增、自减运算 ++ 自增 -- 自减 单目运算 操作 对操作的变量在运算前或后使其值加(自增)或减(自减) 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
注自增自减 运算对象仅是一个整型变量 如 5++; (a+b)--; 是不允许 ++,--优先级为2级, 从右到左 结合 如 -j++ 理解为 -(j++) j+++k 理解为 (j++)+k + 比++级别低 自增自减 的副作用 C语言中,根据运算符的优先级和结合性决定表达式的计算顺序,但对运算符两侧操作数的求值顺序并未做出明确的规定,不同编译系统采取不同的处理方式。 例 f()+g() 可以 先f(),再g(),最后+ 也可 先g(),再f(),最后+ 但自增自减 将产生歧义性结果。
如 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自增或自减规定: 对表达式中变量前的自增或自减,整个表达式计算之前完成计算 对表达式中变量后的自增或自减,整个表达式计算完成后再计算
6.5.2赋值表达式 1.赋值运算符 = 赋值运算 双目运算 14级 从右到左 格式 变量=表达式 计算表达式的值 将表达式的值赋给变量 将变量的值作为赋值表达式的值 操作 例 a=5 a=b=5 相当于 a=(b=5) a=(b=4)+(c=6) 得 a=10,b=4,c=6 注:当表达式的类型与被赋值的变量不一致时,表达式的值类型强制转成变量的类型
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;
6.5.3 关系表达式 关系运算符 < 小于 < = 小于或等于 > 大于 > = 大于或等于 = = 等于 ! = 不等于 6级 从左到右 双目运算 7级 6.5.4 逻辑表达式 逻辑运算符 && 逻辑与 11级 | | 逻辑或 12级 ! 逻辑非 2级 双目运算 从左自右 单目运算 从右自左
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
逻辑表达式从左到右的顺序计算运算符两侧的操作数,一旦已经能明确答案了,剩余计算就不再做了。逻辑表达式从左到右的顺序计算运算符两侧的操作数,一旦已经能明确答案了,剩余计算就不再做了。 如 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就不再计算
逻辑表达式的等价关系 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
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;
注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
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;
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
逗号表达式的用途 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;