谭浩强版c语言清华大学出版社出
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M为0 时,A中的M= =0为1,不等价 M为非1时,B中的M= =1为0,不等价 C为正确答案 M为1时,D中的M !=1为0,不等价
18
四、 C常用语句
➢ if语句使用注意:
– if 后面的表达式不限于是关系表达式或逻辑表达式, 可以是任意表达式,只要能做出“真”、“假”判断 即可
– if 语句中可以嵌套使用if 语句,在嵌套的if 语句中else 子句与最近的,不带else的if相结合(最近配对原则)
(double) a (float) (b*c)
– 区别:
int a; 与 (int) a (int) x+y 与 (int) (x+y)
– 注意:强制类型转换只能对变量或表达式的 数据作暂时性的类型转换,并不能改变变量 在程序中定义的数据类型。
12
➢ 关系运算和关系表达式
运算符优先级
< , > , <= , >=
C为正确答案。
24
➢ for 语句 格式:for(e1;e2;e3) 循环体;
– 说明:
e1:赋初值,只执行一次;e2:循环条件; e3:使e2有可能不满足的表达式
e1、e2、e3、循环体都可能为空,但不能省 略“;”,若省去e2,则是无限循环;若省去 e1、e3,即仅有条件判断,则完全等同于 while语句
1
二、数据类型
基本类型
构造类型
– 整型
– 数组类型
– 实型(float、double) – 结构体(struct)
– 字符型
– 共用体(union)
– 枚举型
指针类型
空类型(void)
注意:在C语言中,用0表示“假”,用非0的数表示“真”
2
➢ 整型数据
整型常量思考:的0数39据是?几??进制整型变量
一、基本语法
标识符
– 定义:字母或下划线开头后跟字母、数字、下划线 – 分类:
关键字:共32个关键字,用小写英文字母表示,不 允许作为用户自定义标识符。
预定义标识符:在C语言中具有特定含义,如C语言 中提供的库函数名字和预编译处理命令。
用户标识符:用户根据需要对C程序中用到的变量、 符号常量、自定义函数或文件指针进行命名,形成 用户标识符。
e1、e3可以是逗号表达式 for语句的流程图:
25
e1:赋初值
假
e2
真
循环体
循环 出口
e3
26
➢ continue、break语句
– 说明:
1. continue、break不能单独使用,只能与循环语句或 switch合用
2. continue增加循环入口,break增加循环或switch语 句的出口
例:
do{……
do{……
if (e1) continue; if (e1) break;
……
……
}while(e2);
}while(e2);
跳出
27
程序1:
main( ) { int i,j,x=0;
for(i=0;i<2;i++) { x++; for(j=0;j<=3;j++) { if (j%2) continue; x++; } x++; }
循环 出口
22
➢ do-while语句执行情况:
循环体至少执行一次
循环体语句
表达式 非0
0
循环 出口
23
练习:
– 若k为整型,则while循环:
k=0;
while (k=0) k=k-1;
A.执行10次
B.无限循环
C.一次也不执行 D.执行一次
分析:因为条件判断表达式k=0是赋值语句, 该表达式的结果为0,条件始终为假。
++:自增运算符,只适用于整型变量
如:i++、++i
- -:自减运算符,只适用于整型变量
如:i- -、- -i
用法说明:
– 对于单独的变量来说,前置和后置运算没有区别, 都是使变量自增1或自减1
– 前置和后置运算与其他运算符结合 • 前置运算:先对变量加、减1,再取变量值 • 后置运算:先取变量值,再对变量加、减1
1. A. ? : 2. A. *=
B. ++ C. && D.+= B. >= C. (类型) D. ,
3. A. | |
B. % C. !
D. ==
4. A. =
B. != C. * D. ( )
16
➢ 对几种运算符优先级别的归纳:
– 初等运算符(包括( )、[ ]等)
高
– 单目运算符(!、++、--、(类型))
8
– 思考:
执行下列程序段以后,i、k的值?
i=3;
k=(++i)+(++i)+(++i);
• 设x,y均为int型变量,且x=10,y=3则以下语句的输
出结果是: (++i):i+1=3+1=4; printf(“%d,%d\n(”+,x+-i)-:, -i-+y1)=; 4+1=5;
(++i):i+1=5+1=6; k=(++i)+(++i)+(++i); =4+5+6=15?????? k=i+i+i=6+6+6=18
10
➢ 逗号运算
逗号运算符:, 逗号表达式
– 格式: 表达式1,表达式2,…,表达式n
– 求解过程:
依次求出表达式1、表达式2、…,表达式n的值 表达式n的值即为整个表达式的值
– 例如:
a=2*3,a*2,a+5 表达式的值为11
11
➢ 强制类型转换
– 格式: (类型名) 变量名(或表达式) – 例如:
– 十进制整数
– 基本型(int)
如:1、2、3…
– 短整型(short)
– 八进制整数
以“0”开头 如:023、056…
– 十六进制整数
以“0x”开头 如:0x23、0x56…
– 长整型(long) – 无符号型(unsigned)
无符号整型 无符号短整型 无符号长整型
3
使用说明:
if (…)
if (…)
if (…)语句1; { if(…)语句1;}
else 语句2;
else 语句2;
19
➢ switch语句使用注意:
– switch后面的表达式和case后的常量表达式可以为 任何整型数据(如整型表达式、字符型、枚举型); 但不允许是实型数据
– 每个case后的常量表达式的值应互不相同 – switch语句中可以不含default分支,default分支并
30
– 使用注意:Байду номын сангаас
1. 数组名是用户自定义标识符 2. 数组元素下标由0开始,下标值为正整数 3. 常量表达式定义了数组的长度,长度值不能由变
量充当,即不允许对数组大小作动态定义 错例:
int n; scanf(“%d”,&n); int a[n];
31
数组的引用
– 地址引用:
在C语言中,数组名代表该数组的首地址,即第0 个元素的地址
6
三、运算符与表达式
➢ 算术运算
算术运算符
– “/”:操作对象不同,含义不同
整除:两个数为整型数据,完成整除运算 如:5/3=1;3/4=0;
实除:两个数中有一个为实型数据,完成实除运算 如:5.0/3=1.666667;
– “%”:求余运算符,只适用于整型数据 如:5%3=2
7
– 单目运算符:++和--
– 算术运算符(先*、/、%,后+、-)
– 关系运算符
– 逻辑运算符(不包括!)
– 条件运算符
– 赋值运算符(=、+=、等等)
– 逗号运算符
低
17
练习:
1. 若给定条件表达式:( M )? (a++):(a- -),则 其中表达式M与:
A.(M==0)等价 B.(M==1)等价 C.(M!=0)等价 D.(M!=1)等价 分析:
– 在某些系统下,int和short int等价,占用内存2个字节, 取值范围为-32768~32767之间
– long int占用4个字节 – 在整常量后加一个字母l或L,认为该数是long int型
4
➢ 实型数据
实型常量
– 十进制形式:123.5、-754.0 – 指数形式:
1.23×103在C语言中应表示为1.23e3 注意:e(E)前必须有数字,e(E)后指数必须是整数 合法数据:6.28e-3、3.5e4等等 非法数据:e5、6.23e3.5
switch(y) {case 0: a++;break; case 1: b--; break; } case 2: a++; b++;break; case 3: a--; b--; } printf(“a=%d,b=%d\n”,a,b); }
21
➢ while语句执行过程:
0 表达式 非0 循环体语句
实型变量
– 单精度实型(float):占4个字节(32位) – 双精度实型(double):占8个字节(64位)
5
➢ 字符型数据
字符型常量
– 定义:
用单引号括起来的单个字符 如:‘a’、’A’、’3’
以“\”开头的特殊字符 如:‘\n’、’\t’、’\b’等等
字符型变量
– 字符数据在内存中的存放原则:用一个字节存放字 符的ASCII码
int b[ ]={1,2,3,4};
等价于:int b[4]={1,2,3,4};
33
➢ 二维数组的定义和引用
定义:
类型名 数组名[常量表达式1][常量表达式2] 例:int a[2][3]; – 说明:
int a[2][3];表示数组a在内存中开辟了6个连续的存储 单元,用来存储数组元素a[0][0]、a[0][1]、a[0][2]、 a[1][0]、a[1][1]、a[1][2],每一维的下标由0开始,在 内存中按行存放。
printf(“k=%d\n”,k); }
29
五、数组
➢ 一维数组的定义和引用 定义
数组类型名 数组名[常量表达式]; – 例:int a[10]; – 说明:a为数组名,int a[10]表示a数组在内存中开
辟了10个连续的存储单元存放a数组的10个变量a[0]、 a[1]、…、a[9],且每个元素均为整型
9
➢ 复合的赋值运算符
– +=、-=、*=、/=、%=
例如:a+=b 等价于 a=a+b;
– 归纳为
a op=exp;(其中:op为运算符,exp为表达式) 求值过程: 1. 求exp的值 2. 把求出的exp与a作op运算 3. 把2. 的结果再赋给变量a
– 例:若a=12,则a+=a-=a*=a的值?
高
== , !=
低
注意:
关系运算符为双目运算符,结合方向自左向右 关系运算的结果为整数值:0或1
13
➢ 逻辑运算符
&& :与 ||:或 !:非 – 使用时注意: 逻辑运算符的结合性:自左向右 运算量的值用0 表示“假”,用非0 的数表示 “真” 表达式的结果为:0 代表“假”,1 代表“真” – 例:i=0,j=0,a=2; if((++i>0)||(++j>0)) a++; printf(“i=%d j=%d a=%d\n”,i,j,a); 输出结果为:i=1 j=0 a=3
printf(“x=%d\n”,x); }
28
程序2:
main( ) { int k=0; char c=‘A’;
do{ switch(c++) { case ‘A’:k++;break; case ‘B’:k- -; case ‘C’:k+=2;break; case ‘D’:k=k%2;continue; case ‘E’:k=k*10;break; default:k=k/3; } k++; } while(c<‘G’);
引申:第1个元素地址:a+1 第2个元素地址:a+2 …… 第i 个元素地址:a+i
– 元素引用:
数组名[下标表达式];(下标由0开始) 只能逐个引用数组元素而不能一次引用整个数组
32
数组的初始化
– 在定义时赋值
int a[10]={0,1,2,3,4,5,6,7,8,9};
相当于:a[0]=0; a[1]=1;……; a[9]=9; – 只赋值一判部断分下,列剩的余初部始分化按是“否0”等处价理: 则ain[4t ]a~[a1[09]]=ii为{nn1tt,02,bb;3[[,14}]0;=]{=1{,12,,23,,34,}4;}; – 允许通过所赋初值的个数来定义数组长度
不限定在最后,几个case分支没有顺序区别,但必 须做适当处理,否则会影响执行结果 – 为了执行某个case分支后跳出switch结构,应在每 个case分支后加上break语句,流程图如图所示:
20
写出下面程序的运行结果
main( ) { int x=1,y=0,a=1,b=1;
switch(x) { case 1:
14
➢ 条件运算符 ?:
– 结合性:自右向左
– 例如:若a=5,b=6,c=7,d=8,求表达式a>b?a:c>d?c:d 的值
– 求解过程:
该表达式可改写为a>b?a:(c>d?c:d) 值为8
几种运算符的优先级
条件运算符—逻辑运算符(!除外)—关系运算符
低
高
15
例1:在下列各组运算符中,优先级别 最高的是:
gets函数输入一个字符串函数输入一个字符串将第一个字符用一个变量存储起来通过循环将第一个字符用一个变量存储起来通过循环左移字符左移字符第一个字符放在串尾第一个字符放在串尾用用printfprintf函数进行输出函数进行输出41几点重要说明几点重要说明函数的定义在程序中都是平行的即不允许在一个函数的定义在程序中都是平行的即不允许在一个函数的内部再定义另一个函数函数的内部再定义另一个函数函数名是用户自定义标识符当函数值为函数名是用户自定义标识符当函数值为整型整型时类型名可省略当函数只完成某个操作而不返回值时型名可省略当函数只完成某个操作而不返回值时可用类型名可用类型名voidvoid形参表中的形参是用户自定义标识符没有参数时形参表中的形参是用户自定义标识符没有参数时圆括号不能省略函数为无参函数圆括号不能省略函数为无参函数421
18
四、 C常用语句
➢ if语句使用注意:
– if 后面的表达式不限于是关系表达式或逻辑表达式, 可以是任意表达式,只要能做出“真”、“假”判断 即可
– if 语句中可以嵌套使用if 语句,在嵌套的if 语句中else 子句与最近的,不带else的if相结合(最近配对原则)
(double) a (float) (b*c)
– 区别:
int a; 与 (int) a (int) x+y 与 (int) (x+y)
– 注意:强制类型转换只能对变量或表达式的 数据作暂时性的类型转换,并不能改变变量 在程序中定义的数据类型。
12
➢ 关系运算和关系表达式
运算符优先级
< , > , <= , >=
C为正确答案。
24
➢ for 语句 格式:for(e1;e2;e3) 循环体;
– 说明:
e1:赋初值,只执行一次;e2:循环条件; e3:使e2有可能不满足的表达式
e1、e2、e3、循环体都可能为空,但不能省 略“;”,若省去e2,则是无限循环;若省去 e1、e3,即仅有条件判断,则完全等同于 while语句
1
二、数据类型
基本类型
构造类型
– 整型
– 数组类型
– 实型(float、double) – 结构体(struct)
– 字符型
– 共用体(union)
– 枚举型
指针类型
空类型(void)
注意:在C语言中,用0表示“假”,用非0的数表示“真”
2
➢ 整型数据
整型常量思考:的0数39据是?几??进制整型变量
一、基本语法
标识符
– 定义:字母或下划线开头后跟字母、数字、下划线 – 分类:
关键字:共32个关键字,用小写英文字母表示,不 允许作为用户自定义标识符。
预定义标识符:在C语言中具有特定含义,如C语言 中提供的库函数名字和预编译处理命令。
用户标识符:用户根据需要对C程序中用到的变量、 符号常量、自定义函数或文件指针进行命名,形成 用户标识符。
e1、e3可以是逗号表达式 for语句的流程图:
25
e1:赋初值
假
e2
真
循环体
循环 出口
e3
26
➢ continue、break语句
– 说明:
1. continue、break不能单独使用,只能与循环语句或 switch合用
2. continue增加循环入口,break增加循环或switch语 句的出口
例:
do{……
do{……
if (e1) continue; if (e1) break;
……
……
}while(e2);
}while(e2);
跳出
27
程序1:
main( ) { int i,j,x=0;
for(i=0;i<2;i++) { x++; for(j=0;j<=3;j++) { if (j%2) continue; x++; } x++; }
循环 出口
22
➢ do-while语句执行情况:
循环体至少执行一次
循环体语句
表达式 非0
0
循环 出口
23
练习:
– 若k为整型,则while循环:
k=0;
while (k=0) k=k-1;
A.执行10次
B.无限循环
C.一次也不执行 D.执行一次
分析:因为条件判断表达式k=0是赋值语句, 该表达式的结果为0,条件始终为假。
++:自增运算符,只适用于整型变量
如:i++、++i
- -:自减运算符,只适用于整型变量
如:i- -、- -i
用法说明:
– 对于单独的变量来说,前置和后置运算没有区别, 都是使变量自增1或自减1
– 前置和后置运算与其他运算符结合 • 前置运算:先对变量加、减1,再取变量值 • 后置运算:先取变量值,再对变量加、减1
1. A. ? : 2. A. *=
B. ++ C. && D.+= B. >= C. (类型) D. ,
3. A. | |
B. % C. !
D. ==
4. A. =
B. != C. * D. ( )
16
➢ 对几种运算符优先级别的归纳:
– 初等运算符(包括( )、[ ]等)
高
– 单目运算符(!、++、--、(类型))
8
– 思考:
执行下列程序段以后,i、k的值?
i=3;
k=(++i)+(++i)+(++i);
• 设x,y均为int型变量,且x=10,y=3则以下语句的输
出结果是: (++i):i+1=3+1=4; printf(“%d,%d\n(”+,x+-i)-:, -i-+y1)=; 4+1=5;
(++i):i+1=5+1=6; k=(++i)+(++i)+(++i); =4+5+6=15?????? k=i+i+i=6+6+6=18
10
➢ 逗号运算
逗号运算符:, 逗号表达式
– 格式: 表达式1,表达式2,…,表达式n
– 求解过程:
依次求出表达式1、表达式2、…,表达式n的值 表达式n的值即为整个表达式的值
– 例如:
a=2*3,a*2,a+5 表达式的值为11
11
➢ 强制类型转换
– 格式: (类型名) 变量名(或表达式) – 例如:
– 十进制整数
– 基本型(int)
如:1、2、3…
– 短整型(short)
– 八进制整数
以“0”开头 如:023、056…
– 十六进制整数
以“0x”开头 如:0x23、0x56…
– 长整型(long) – 无符号型(unsigned)
无符号整型 无符号短整型 无符号长整型
3
使用说明:
if (…)
if (…)
if (…)语句1; { if(…)语句1;}
else 语句2;
else 语句2;
19
➢ switch语句使用注意:
– switch后面的表达式和case后的常量表达式可以为 任何整型数据(如整型表达式、字符型、枚举型); 但不允许是实型数据
– 每个case后的常量表达式的值应互不相同 – switch语句中可以不含default分支,default分支并
30
– 使用注意:Байду номын сангаас
1. 数组名是用户自定义标识符 2. 数组元素下标由0开始,下标值为正整数 3. 常量表达式定义了数组的长度,长度值不能由变
量充当,即不允许对数组大小作动态定义 错例:
int n; scanf(“%d”,&n); int a[n];
31
数组的引用
– 地址引用:
在C语言中,数组名代表该数组的首地址,即第0 个元素的地址
6
三、运算符与表达式
➢ 算术运算
算术运算符
– “/”:操作对象不同,含义不同
整除:两个数为整型数据,完成整除运算 如:5/3=1;3/4=0;
实除:两个数中有一个为实型数据,完成实除运算 如:5.0/3=1.666667;
– “%”:求余运算符,只适用于整型数据 如:5%3=2
7
– 单目运算符:++和--
– 算术运算符(先*、/、%,后+、-)
– 关系运算符
– 逻辑运算符(不包括!)
– 条件运算符
– 赋值运算符(=、+=、等等)
– 逗号运算符
低
17
练习:
1. 若给定条件表达式:( M )? (a++):(a- -),则 其中表达式M与:
A.(M==0)等价 B.(M==1)等价 C.(M!=0)等价 D.(M!=1)等价 分析:
– 在某些系统下,int和short int等价,占用内存2个字节, 取值范围为-32768~32767之间
– long int占用4个字节 – 在整常量后加一个字母l或L,认为该数是long int型
4
➢ 实型数据
实型常量
– 十进制形式:123.5、-754.0 – 指数形式:
1.23×103在C语言中应表示为1.23e3 注意:e(E)前必须有数字,e(E)后指数必须是整数 合法数据:6.28e-3、3.5e4等等 非法数据:e5、6.23e3.5
switch(y) {case 0: a++;break; case 1: b--; break; } case 2: a++; b++;break; case 3: a--; b--; } printf(“a=%d,b=%d\n”,a,b); }
21
➢ while语句执行过程:
0 表达式 非0 循环体语句
实型变量
– 单精度实型(float):占4个字节(32位) – 双精度实型(double):占8个字节(64位)
5
➢ 字符型数据
字符型常量
– 定义:
用单引号括起来的单个字符 如:‘a’、’A’、’3’
以“\”开头的特殊字符 如:‘\n’、’\t’、’\b’等等
字符型变量
– 字符数据在内存中的存放原则:用一个字节存放字 符的ASCII码
int b[ ]={1,2,3,4};
等价于:int b[4]={1,2,3,4};
33
➢ 二维数组的定义和引用
定义:
类型名 数组名[常量表达式1][常量表达式2] 例:int a[2][3]; – 说明:
int a[2][3];表示数组a在内存中开辟了6个连续的存储 单元,用来存储数组元素a[0][0]、a[0][1]、a[0][2]、 a[1][0]、a[1][1]、a[1][2],每一维的下标由0开始,在 内存中按行存放。
printf(“k=%d\n”,k); }
29
五、数组
➢ 一维数组的定义和引用 定义
数组类型名 数组名[常量表达式]; – 例:int a[10]; – 说明:a为数组名,int a[10]表示a数组在内存中开
辟了10个连续的存储单元存放a数组的10个变量a[0]、 a[1]、…、a[9],且每个元素均为整型
9
➢ 复合的赋值运算符
– +=、-=、*=、/=、%=
例如:a+=b 等价于 a=a+b;
– 归纳为
a op=exp;(其中:op为运算符,exp为表达式) 求值过程: 1. 求exp的值 2. 把求出的exp与a作op运算 3. 把2. 的结果再赋给变量a
– 例:若a=12,则a+=a-=a*=a的值?
高
== , !=
低
注意:
关系运算符为双目运算符,结合方向自左向右 关系运算的结果为整数值:0或1
13
➢ 逻辑运算符
&& :与 ||:或 !:非 – 使用时注意: 逻辑运算符的结合性:自左向右 运算量的值用0 表示“假”,用非0 的数表示 “真” 表达式的结果为:0 代表“假”,1 代表“真” – 例:i=0,j=0,a=2; if((++i>0)||(++j>0)) a++; printf(“i=%d j=%d a=%d\n”,i,j,a); 输出结果为:i=1 j=0 a=3
printf(“x=%d\n”,x); }
28
程序2:
main( ) { int k=0; char c=‘A’;
do{ switch(c++) { case ‘A’:k++;break; case ‘B’:k- -; case ‘C’:k+=2;break; case ‘D’:k=k%2;continue; case ‘E’:k=k*10;break; default:k=k/3; } k++; } while(c<‘G’);
引申:第1个元素地址:a+1 第2个元素地址:a+2 …… 第i 个元素地址:a+i
– 元素引用:
数组名[下标表达式];(下标由0开始) 只能逐个引用数组元素而不能一次引用整个数组
32
数组的初始化
– 在定义时赋值
int a[10]={0,1,2,3,4,5,6,7,8,9};
相当于:a[0]=0; a[1]=1;……; a[9]=9; – 只赋值一判部断分下,列剩的余初部始分化按是“否0”等处价理: 则ain[4t ]a~[a1[09]]=ii为{nn1tt,02,bb;3[[,14}]0;=]{=1{,12,,23,,34,}4;}; – 允许通过所赋初值的个数来定义数组长度
不限定在最后,几个case分支没有顺序区别,但必 须做适当处理,否则会影响执行结果 – 为了执行某个case分支后跳出switch结构,应在每 个case分支后加上break语句,流程图如图所示:
20
写出下面程序的运行结果
main( ) { int x=1,y=0,a=1,b=1;
switch(x) { case 1:
14
➢ 条件运算符 ?:
– 结合性:自右向左
– 例如:若a=5,b=6,c=7,d=8,求表达式a>b?a:c>d?c:d 的值
– 求解过程:
该表达式可改写为a>b?a:(c>d?c:d) 值为8
几种运算符的优先级
条件运算符—逻辑运算符(!除外)—关系运算符
低
高
15
例1:在下列各组运算符中,优先级别 最高的是:
gets函数输入一个字符串函数输入一个字符串将第一个字符用一个变量存储起来通过循环将第一个字符用一个变量存储起来通过循环左移字符左移字符第一个字符放在串尾第一个字符放在串尾用用printfprintf函数进行输出函数进行输出41几点重要说明几点重要说明函数的定义在程序中都是平行的即不允许在一个函数的定义在程序中都是平行的即不允许在一个函数的内部再定义另一个函数函数的内部再定义另一个函数函数名是用户自定义标识符当函数值为函数名是用户自定义标识符当函数值为整型整型时类型名可省略当函数只完成某个操作而不返回值时型名可省略当函数只完成某个操作而不返回值时可用类型名可用类型名voidvoid形参表中的形参是用户自定义标识符没有参数时形参表中的形参是用户自定义标识符没有参数时圆括号不能省略函数为无参函数圆括号不能省略函数为无参函数421