c语言复习总结1.docx
《c语言复习总结1.docx》由会员分享,可在线阅读,更多相关《c语言复习总结1.docx(25页珍藏版)》请在冰点文库上搜索。
c语言复习总结1
c语言复习总结
(*为补充说明部分;**部分可选择性的看看;其中还有一些具体的内容可查上课的那本或谭浩强的那本书,会以(课Px)或(谭Px)的形式表示,x表示第几页)
一、数据类型、运算符、表达式
【1】常量和符号常量(即“值”)
**①整型常量;浮点常量;字符常量
②标识符常量:
#defineHAHA123
(用#define命令定义的HAHA为常量,该值为123,不可对其赋值)
标识符常量的好处:
易理解;程序中多处用到该值时便于修改
【2】变量
变量是一个拥有变量名(eg:
haha),并可对其赋值的一个量
(所有变量必须先定义,才能再使用)
命名规则:
只能由字母、数字和下划线组成,且第一个字符不能为数字
eg:
my,My,MY,my_name,my_123,_name
(c语言区分大小写,故my≠My)
【3】关键字(课P23)
1.保留字(共37个,不能当做变量用):
intfor等
2.分隔符:
#(;等
3.运算符(若由两个符号组成,则中间不能有空格):
!
+-->=等
4.间隔符(没有实际意义,便于机器解读程序):
空格、行结束符、换页符等
【4】数据类型
1.浮点型(即小数):
1)适合的运算:
+-*/(不可求模:
%)
编程前注意运算时是否会产生精度损失(类型转换时的误差或处理数据时的误差)
2)分类:
比特(位)数有效数字**数值范围
float:
326~7-3.4*10^(-38)~3.4*10^38
double:
6415~16-1.7*10^(-308)~1.7*10^308
longdouble:
12818~19-1.2*10^(-4932)~1.2*10^(-4932)
*对于不同的编译系统有效数字个数(比特数)会有差异(谭P46)
3)形式:
十进制小数形式(eg:
1.23)、指数形式(eg:
123e3或123E3)(课P29)(谭P45)
*指数形式下:
字母e(E)前必须有数字,其后必须也有数字且为整数;输出时是规范化的指数形式(谭P45)
**4)浮点型数据的舍入误差(谭P47及47页最后一段)
**5)浮点型数据在内存中的存放形式:
[[+/-][.小数部分][指数部分]](谭P45-46)
2.整数型
1)适合的运算:
%+-*/(整数除法:
只取商数部分,不取余数,不进行四舍五入)(课P27)
2)分类:
比特(位)数取值范围(部分)
int:
16-32768~32768即-2^15~(2^15-1)
**unsignedint:
160~65535即0~(2^16-1)
short:
16
**unsignedshort:
16
long:
32
**unsignedlong:
32
*对于不同的编译系统,取值范围有差异,若超过取值范围则会产生数据的溢出问题(谭P43、44)
3)在计算机中的表示方法:
十进制、八进制(以0开头)、十六进制(以0x开头)
**4)整型数据在内存中的存放形式:
以补码形式存放(谭P40)
3.字符型(char)
1)字符型附属于整数型,它是以整数型的形式存放在计算机内存中的。
每个字符对应一个整数数值(即ASCII码,范围为0~127),且字char型与int型可通用,以''来表示,单引号里只能有一个字符。
2)常用转义字符:
(课P30)含义**ASCII码
\n换行,光标移到下行开头10
\b退格,光标移到前一列8
\r回车,光标移到本行开头13
\'单引号39
\"双引号34
\0空操作符(用于字符串有关地方)
3)常用字符ASCII码:
'0'47
'1'48
'A'65
'a'97
4)字符串型,以""来表示(双引号里可以有多个字符)。
字符串实际长度等于字符串长度+1
eg:
"abc"的实际长度为4,系统默认在它最后追加一个\0,即实际为"abc\0",\0是字符串结束符,用来告诉机器,这是一个字符串,但输出时不会打印\0,遇到\0便结束。
要灵活运用\0。
*'a'≠"a"
不能把一个字符串常量赋值给字符变量(即:
charc="abc"是错误的),机器是以字符数组的形式存储字符串的。
【5】变量赋初值
在定义变量的时候能对变量赋初值,赋初值时不能用连等号,但在程序中允许使用连等号,且连等号从右向左执行。
eg:
inta=b=c=123;(不允许)
a=b=c=123;(允许)
【6】各数据间的隐式转换
1.不同数据类型可进行混合运算,但机器会自动将它们转换成其中最高级的类型(一步直接转换),然后再进行运算。
*转换级别(简):
(谭P54)(课P33)低→高
int→unsigned→long→double
char、short↗↖float
2.强制类型转换:
(
形式:
(类型名)
eg:
(float)5/2结果为2.5
(char)('A'+'a')结果为'q',若写成(char)'A'+'a',则结果为int类型的113
**将一个int、short、long型变量转化成char型时,是把后八位(2进制数)截断赋值给char型变量。
【7】算术运算符和算术表达式
1.运算符:
(**表达式类别、*结合关系、*优先级见课P21)
1)算术运算(*/%+-)
2)关系运算(><==>=<=!
=)
3)逻辑运算(!
&&||)
**4)位运算(<<>>~|^&)
5)赋值运算(=+=-=*=/=%=++^=&=<<=等)
6)条件运算(?
:
)
7)逗号运算(,)
8)指针运算(*(取内容)&(取地址))
*9)求字节数运算(sizeof)
*10)强制类型转换运算((类型名))
11)分量运算符(结构体中)(.->)
12)下标运算符(数组中)([])
13)其他(如函数调用运算符())
2.基本算术运算符:
运算时,系统会把数据先自动转换成表达式中的最高类型,再进行运算
eg:
inta,b=1;
floatc=2.3;
a=b+c;
先把b转换成float型(b本身类型并没变,只不过在这次运算中改变了)1.0+2.3=3.3,然后把3.3赋值给整型a(a=3,截断误差)。
3.强制类型转换:
在强制类型转换时,只是得到一个所需类型的中间变量,原来变量的类型并未发生变化。
4.自增、自减运算符:
i++,先使用,再自增
++i,先自增,再使用
eg:
若i等于3
则①j=i++;(先把3赋值给j,之后i递增1变成4,即j=3,i=4)
②j=++i;(i先递增1变成4,之后把4赋值给j,即j=4,i=4)
*①自增(++)、自减(--)运算只能用于变量,不能用于常量
eg:
#definea3
a++;
这是错误的,因为这里的a被宏定义为3,即a是常量,所以不能用自增运算
②++,--的结合性是从右往左
eg:
-i++相当于-(i++)并不等于(-i)++,因为这显然错误,-i运算后是一个常量,不能对常量进行自增运算
a+++b相当于a+(++b)并不等于(a++)+b
*自增(减)运算常用于循环语句中,使循环变量自增或自减1;也用于指针变量,使其指向下一个地址
5.赋值运算符
①高类型数据赋值给低类型变量时,会产生精度损失(截断误差)
eg:
floata=3.3;
intb;
b=a;
此时,b等于3,因为将浮点型数据(包括单、双精度)赋值给整型变量时,会舍弃小数部分。
**将一个unsigned类型数据赋值给一个占字节数相同的非unsigned型整型变量(eg:
unsignedlong→long)时,注意符号位的问题,当心数据错误(谭P61)
②低类型的数据赋值给高类型的变量时,不足位会以0补齐
**带符号的char型(signedchar)赋给int型以及带符号的int型(signedchar)赋给long型时的符号扩展问题。
(谭P60)
**有符号数据传给无符号变量时符号位的问题。
(谭P60~61)
6.复合赋值运算符:
能简化程序,产生高质量目标代码
eg:
a+=3等价于a=a+3
注意,如果等号右边是包含若干项的表达式,则相当于它有括号。
eg:
(以下3种写法等价)
①x%=y+3
②x%=(y+3)
③x=x%(y+3)
7.赋值表达式:
它的一般形式为:
<变量><赋值运算符><表达式>
*赋值运算符左侧的标识符称为“左值”,像表达式a+b、常量、常变量(宏定义的量)都不能作为左值,而在赋值运算符右侧的表达式称为右值。
凡是左值都可用做右值。
赋值表达式中的“表达式”,又可以是一个赋值表达式。
赋值运算符按照“从右到左”的结合顺序。
于是下列运算都是合法的:
a=b=c=5(赋值表达式值为5,a、b、c值均为5)
a=5+(c=6)(表达式值为11,a值为11,c值为6)
a=(b=10)/(c=2)(表达式值为5,a等于5,b等于10,c等于2)
但要区别a=3*5=4*3,这是错误的,因为从右至左运算,先计算3*5=4*3,显然,常量不能作为左值
**赋值表达式也可以包含复合的赋值运算。
eg:
a+=a-=a*a
如果a的初值为12,它的求解步骤如下:
①先进行“a-=a*a”的运算,它相当于a=a-a*a,a的值为12-144=-132
②再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264
赋值表达式也可以出现在别的语句中(这是c语言灵活性的一种表现)。
eg:
①printf("%d",a=b);若b=1,先把1赋值给a,再打印出a的值,即1
②while((c=getch())!
='\n')作用为输入一个字符,直到按回车结束
*getch()与getchar()的区别(相同点:
都只能读入一个字符):
用getch()读入一个字符时,该字符不会显示在屏幕上,并且输入一个字符就算输入结束;而用getchar()读入一个字符时,该字符会显示在屏幕上,并且只有按下回车后,才算输入结束,如果输入的是一串字符,那它们都被保存在“输入流”中,只取第一个字符为getchar()的返回值。
8.逗号运算符和逗号表达式:
其一般形式为:
(结合性从左至右)
表达式1,表达式2,表达式3,…,表达式n
逗号运算符是所有运算符中级别最低的。
eg:
a=3*5,a*4
先进行赋值运算“a=3*5”,a的值和表达式的值都为15,然后进行算术运算“a*4”,表达式的值为60
*逗号表达的值为最后一个表达式的值,即上述逗号表达式的值为60。
在多数情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式常用语循环语句(for语句)中。
像一般的pintf和scanf中的逗号只是用作变量间隔,并不是逗号表达式。
除非像这样:
printf("%d,%d,%d",(a,b,c),b,c);其中(a,b,c)是一个逗号表达式,其它的都不是。
2、语句
【1】c语句概述
1.控制语句(9种)
①if()…else…条件语句
②for()…循环
③while()…循环
④do…while()循环
⑤continue结束本次循环
⑥break中止执行switch或循环
⑦switch多分支选择
⑧goto转向
⑨return从函数返回
()中是一个判断条件,也可以是一个赋值表达式型的判断条件
eg:
if(x>y)或if((a=getch())!
='\n')都是允许的
2.函数调用语句:
由一个函数加一个分号构成。
eg:
printf("abcd");
3.表达式语句:
由表达式加一个分号构成。
4.空语句:
只有一个分号,下面是一个空语句:
;
eg:
for(;a<10;)
for语句中的赋初值和循环体都是空语句
5.复合语句:
用{}括起来构成复合语句。
*c语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求。
但为了可读性,还是要写得规整些。
【2】输入输出的概念
c语言是靠函数实现输入输出的,这些函数包含在stdio.h(standardinput&output,标准输入输出)头文件中。
这样可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好。
可用于输入输出的函数:
putchar()输出字符
**该函数的参数可以是普通字符('a'),可以是控制字符('\n'),亦可以是转义字符('\'',单引号)
getchar()输入字符(记得getchar()比getch()长,要多按个回车)
**getch()输入字符(不显示在屏幕上)
getchar()等效于putchar(getch()),回车效果不算。
puts()输出字符串
gets()输入字符串
printf()格式输出
scanf()格式输入
【3】格式输入与输出
1.printf函数
1)一般格式:
printf(格式控制,输出表列)
*格式控制可以用一个字符串来代替(甚至可以包含printf),这样有时能节省很多空间。
显示了c语言的灵活。
eg:
charpt1[]="%d%d%d",pt2[]="%c%c%c";
:
:
printf((flag?
pt1:
pt2),a,b,c);
2)机器会完全按照“格式控制”下的格式进行输出。
*常用printf格式字符:
格式符
使用形式
m默认值
n默认值
说明
d
%d
10
带符号十进制形式(正数不输出符号)
%md
%-md
u
%u
10
无符号十进制形式
%mu
%-mu
c
%c
1
字符形式输出一个字符
%mc
%-mc
s
%s
字符串长度
输出字符串
%m.ns
%-m.ns
f
%f
20
6
小数形式:
±xx…x.xx…x
%m.nf
%-m.nf
e,E
%e
20
6
指数形式:
±x.xx…xe±xxx
或±x.xx…xE±xxx
%m.ne
%-m.ne
g,G
%g
选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。
用G时,若以指数形式输出,则指数以大写表示。
*①m表示列宽,若m大于数据长度,则以空格补齐。
若m小于数据长度,则按实际长度输出
②字符串中的n,表示取该字符串的前n个字符;实数中的n表示输出的小数位数,若实数中的n过分大于其实际小数部分长度,则输出时可能会有误差
③“-”号表示左对齐,无“-”号表示右对齐
④l表示长整形整数,可加在格式符d、o(8进制)、x(16进制)、u前
⑤上面介绍的格式字符只有跟在%后面才作为格式符号:
eg:
%fc则按小时形式输出,后面跟一个字符c
%cf则按字符形式输出一个字符,后面跟一个字符f
⑥要输出“%”号,其格式为:
%%
⑦格式控制中还可以使用转义字符
2.scanf函数
1)一般格式:
scanf(格式控制,地址列表)
格式控制的含义同printf函数,“地址列表”是由若干个地址组成的列表,可以是变量的地址,亦可以是字符串的首地址。
Scanf的格式控制符和printf的类似,但它没有n和“-”号的功能,除了保留m的功能,还增加了h和*的功能。
①m:
eg:
scanf("%3d%3d",&a,&b);
如果输入123456,那么a=123,b=456
②h:
h表示短整型数据,可以加在格式符d、o、x前
③*:
表示本输入项在读入后不赋给相应的变量
eg:
scanf("%2d%*3d%2d",&a,&b);
如果输入:
1234567,那么系统会把12赋给变量a,345虽被机器读入,但不会赋给任何变量(该数据被跳过),67赋给变量b。
2)scanf中除了格式控制符外有任何其他符号,则在输入时要在对应的位置输入相同字符。
eg:
scanf("%d,,%c",&a,&b);
输入时就应该像这样输入:
3,,A
3)在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符,要避免这种歧义的产生。
eg:
scanf("%c%c%c",&a,&b,&c);
若输入:
abc
则实际为a='a',b='',c='b'
正确的输入方法为:
abc
4)在输入数据时,遇到以下情况时认为该数据结束;
①遇空格,或按“回车”或按“跳格”(Tab)键;
②按指定宽度结束,如“%3d”,只取3列;
③遇非法输入(和指定的格式字符类型不相匹配的数据)
**5)不要连用多个scanf
eg:
scanf("%d",&a);
printf("a=%d\n",a);
scanf("%c",&b);
printf("b=%c\n",b);
如果输入:
123A
那么显示:
123
原因:
c语言中,所有的输入都保存在输入流中,包括空格、回车等。
当调用scanf函数(或其他输入函数)时,scanf会从输入流中取得数据。
比如输入的是:
123A,如果我们像上面一样连用两个scanf,那第一个数据读到空格时结束,即,机器会把123赋值给变量a,然后“空格”和字符“A”还保存在输入流中,接着打印出a的值并回车(由printf("a=%d\n",a);这句语句完成),再接着,第二个scanf会像输入流中索要数据(如果输入流中还有数据),于是上一次遗留下的“空格”就会给变量b,那么在第二行就会打印:
空格+回车(由printf("b=%c\n",b);这句语句完成),那就不是我们要的效果了。
如何改正:
如果要打印原效果,那么就要在第二个scanf上面加一句getchar();,把“空格”给getchar函数,或者把第二个scanf改成:
scanf("%*c%c",&b);,放弃“空格”。
6)如果某控制字符的下一个控制字符不是%c或%s,那么c语言允许输入时出现多个数据结束符(“空格”或“回车”)
eg:
scanf("%d%f%c",&a,&b,&c);
下面两种输入方式都可以:
①1231234.123a
②123
(回车)
(回车)
1234.123
a
机器仍会把123赋给变量a,把1234.123赋给变量b,把字符'a'赋给变量c
若是输入:
1231234.123a
则变量c就会变成''(空格)。
原因:
c语言会放弃多余的数据结束符,而只取一个。
3、控制结构
【1】顺序结构
从第一个语句开始,一个一个语句地执行,一直执行到最后,如果是复合语句,就要用花括号{}括起来。
【2】选择(分支)结构
1.单分支:
if(表达式)或if(表达式)
语句一;{
语句1;
语句2;
:
}
2.双分支:
if(表达式)
语句1;
else
语句2;
3.if型多分支:
if(表达式1)语句1;
elseif(表达式2)语句2;
elseif(表达式3)语句3;
:
elseif(表达式m)语句m;
else语句n;
*当嵌套if语句时,要在适当的地方加一个{},以示区别
eg:
if()
if()语句1;
else
if()语句2;
else语句3;
如果你是想第1个if和第1个else配对,那就错了。
实际上,第1个else是和第2个if配对的。
因为c语言中,else是和上面的最近的一个if配对的。
要避免这种情况就要把第2个if语句放到{}中。
改成:
if()
{
if()语句1;
}
else
if()语句2;
else语句3;
4.switch型多分支:
switch(表达式)
{
case常量表达式1:
语句1;//break;
case常量表达式2:
语句2;//break;
:
case常量表达式n:
语句n;//break;
default:
语句n+1;
}
*①switch语句中,若在适当的地方没有break语句,那么,它就会从符合的常量表达式k开始的语句k,一直执行到语句n。
②若表达式的值不符合任意一个常量表达式,那就执行default,且default和case出现的顺序并不影响结果。
③每个case中常量表达式的值必须互不相同;否则就会出现互相矛盾的现象。
5.条件运算符:
①其一般形式为:
表达式1?
表达式2:
表达式3
②求解顺序:
先求解表达式1,若为非0(真),则表达示2的值就作为整个条件表达式的值。
若为0(假),则表达式3的值就是整个条件表达式的值。
③结合顺序:
从右至左
eg:
a>b?
a:
c>d?
c:
d相当于a>b?
a:
(c>d?
c:
d)
④优先级:
条件运算符的优先级比关系运算符和算术运算符都低。
⑤表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。
eg:
a>b?
printf("%d",a):
printf("%d",b)
相当于:
if(a>b)
printf("%d",a);
else
printf("%d",a);
也相当于:
printf("%d",a>b?
a:
b);
*灵活运用条件表达式,可以使程序代码精简很多
*以上(表达式)中的表达式,可以是关系表达式,也可以是逻辑表达式。
1)关系运算符和关系表达式:
①关系运算符的优先次序:
<、<=、>、>=优先级相同(高)
==、!
=优先级相同(低)
eg:
a>=b==c等效于(a>=b)==c
算术运算符的优先级高于关系运算符
eg:
a>b+c等效于a>(b+c)
关系运算符的优先级高于赋值运算符
eg:
a=b>c等效于a=(b>c)
*不过为了可读性,最好还是在适当的地方加一下括号()
②关系表达式:
用关系运算符将两个表达式(可以是算术、关系、逻辑、赋值或字符表达式),连接起来的式子,称为关系表达式。
于是,下列关系表达式都是合法的:
a>b,a+b>c+d,(a=b)>(c=d),'a'<'b',(a>b)>(b③关系表达式的结合关系:
从左至右
eg:
a>b>c>d等效于((a>b)>c)>d
④关系表达式的值只有“1”(真)和“0”(假)
2)逻辑运算符和逻辑表达式
&&逻辑与(相当于and)
||逻辑或(相当于or)
!
逻辑非(相当于not)
①优先级:
!
→算术运算符→关系运算符→&&→||→赋值运算符,“!
”的优先级最高
②逻辑表达式:
用逻辑运算符将