少英C语言自学笔记.docx
《少英C语言自学笔记.docx》由会员分享,可在线阅读,更多相关《少英C语言自学笔记.docx(17页珍藏版)》请在冰豆网上搜索。
少英C语言自学笔记
一、运算符
1、算数运算符:
+﹣*/(除)%(取余数)
2、关系运算符:
>>=<<=!
=(不等于)==(等于)
3、逻辑运算符:
!
(非):
!
真----假
!
假----真
&&(与):
真&&真----真
真&&假----假
假&&真----假
假&&假----假
||(或):
真||假----真
假||真----真
真||真----真
假||假----假
▲①&&左边的表达式为假,右边的表达式肯定不会执行
||左边的表达式为真,右边的表达式肯定不会执行
②逻辑运算符的优先级由高到低:
!
、&&、||
4、赋值运算符:
=+=*=/=﹣=
★优先级别:
算数>关系>逻辑>赋值
二、什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位。
1字节=8位1K=1024字节1M=1024K1G=1024M
三、常量以什么样的二进制代码存储在计算机中的
1、整数是以补码的形式转化为二进制代码存储在计算机中的
2、实数是以IEEE754标准转化为二进制代码存储在计算机中的
3、字符的本质实际也是与整数的存储方式相同
四、格式输出函数(printf)
printf函数的作用是向终端(输出设备)输出若干任意类型的数据。
其一般格式为:
printf(格式控制,输出列表)
格式控制是用双引号括起来的字符串(称为转换控制子符串),包括格式字符、普通字符。
格式字符是将输出的数据转化为指定的格式输出,以“%”字符开头;普通字符是需要原样输出的字符,包括双引号内的逗号、空格和换行符。
printf()的4种用法:
1、printf(“字符串”)
2、printf(“输出控制符”,输出参数)
3、printf(“输出控制符1输出控制符2...”,输出参数1,输出参数2...)
▲输出控制符与输出参数的个数必须一一对应
4、printf(“输出控制符非输出控制符”,输出参数)
★Printf函数的附加格式说明字符:
l用于长整型整数,可加在格式符d、o、x、u前面
m(代表一个整数)数据最小宽度
n(代表一个整数)对实数,表示输出n位小数;对字符串,表示截取的字符个数
-输出的数字或字符在域内向左靠
①%ms即%10s表示输出字符串占m列,如果字符串本身长度大于m,则将字符串全部输出,若字符串长度小于m,则在字符串的左侧用空格补全。
②%m.ns即%10.3s表示输出占m列,但只取字符串左端n个字符,这n个字符输出在m列的右侧,左补空格。
③%-ms即%-10s表示如果字符串长度小于m,则在m列范围内,字符串向左靠,右补空格。
④%-m.ns即%-10.3s表示n个字符输出在m列范围内的左侧,右补空格;如果n>m则m自动取n值,即保证n个字符正常输出。
五、格式输入函数(scanf)
scanf函数的功能是指固定的格式,并按照指定的格式接收用户在键盘上输入的数据,最后将数据存储在指定的变量中。
其一般格式为:
scanf(格式控制,地址列表),取地址符&。
★scanf函数的附加格式说明字符
l用于输入长整型数据(可用于%ld、%lo、%lx、%lu)及double型数据(%lf、%le)
h用于输入短整型数据(可用于%hd、%ho、%hx)
n(整数)指定输入数据所占宽度
*表示指定的输入项在读入后不赋给相应的变量
▲输入/输出控制符:
%d——int输入/输出(有符号)十进制整型
%ld——longint输入/输出(有符号)十进制长整型
%u——用来输入/输出(无符号)十进制整型
%c——char输入/输出单个字符
%f——float输入/输出单精度浮点型
%lf——double输入/输出长双精度浮点型
%x(或者%X或者%#X)——int或longint或shortint十六进制输入/输出
%o——int或longint或shortint八进制输入/输出
%s——输出字符串
五、if的用法
if语句有3中形式,分别为:
if语句形式、if...else语句形式、elseif语句形式。
(if默认的只能控制一个语句的执行或不执行。
)
if语句形式:
if(表达式)
语句
if…else语句形式:
if(表达式)
语句块1;
else
语句块2;
elseif语句形式:
if(表达式1)
语句1;表达式1成立,执行语句1
elseif(表达式2)
语句2;表达式1不成立,表达式2成立,执行语句2
elseif(表达式3)
语句3;表达式1、2不成立,表达式3成立,执行语句3
:
else
语句n;以上表达式均不成立,执行语句n
★if的嵌套形式:
if(表达式1)
{
if(表达式2)语句块1;
else语句块2;
}
else
{
if(表达式3)语句块3;
else语句块4;
}
▲在使用if语句嵌套时,应注意if与else的配对情况;else总是与其上面的最近的未配对的if进行配对。
六、常用转义字符表
\n回车换行\t横向跳到下一制表位置
\v竖向跳格\b退格
\r回车\f走纸换页
\\反斜线符“\”\’单引号符
\a鸣铃\ddd1~3位八进制数所代表的字符
\xhh1~2位十六进制数所代表的字符
七、条件运算符(?
)
条件运算符对一个表达式的真或假值进行,然后根据检验结果返回另外两个表达式中的一个。
条件运算符的一般形式:
表达式1?
表达式2:
表达式3;
在运算中,先对表达式1的值进行检验,如果只为真,则返回表达式2的结果值;如果为假,则返回表达式3的结果值。
八、switch语句
switch语句是多分支选择语句(提高可读性),switch语句检验的条件必须是一个整型表达式(可包含运算符和函数调用);而case语句检验的值必须是整型常量(可以是常量表达式或常量运算)。
switch语句的一般形式为:
switch(表达式)
{
case情况1:
语句块1;
break;
case情况2:
语句块2;
break;
…
case情况n:
语句块n;
break;
default:
默认情况语句块;
break;
}
▲在每一个case或default语句后都有一个break关键字,break语句用于跳出switch结构,不再执行switch下面的代码。
如果将case后面的(break)去掉,则会将case检验相符情况后的所有语句进行输出;任意两个case语句都不能使用相同的常量值。
▲在使用switch语句时,如果没有一个case语句后面的值能匹配switch语句的条件,就执行default语句后面的代码,每一个switch结构只能有一个default语句。
九、循环语句
1、while语句:
使用while语句可以执行循环结构,其一般形式为:
while(表达式)语句。
while语句先检验一个条件,即括号中的表达式;当表达式为真时,则执行紧跟其后的语句或语句块。
每完成一遍循环,程序都将回到while语句处,重新检验条件是否为真。
若为真,那么循环将一直执行,直到条件为假时,循环终止。
若一开始条件就为假,则循环一次也不执行,直接执行后面的程序代码。
2、do-while语句:
do-while语句先执行循环体语句中的内容,再判别表达式,若表达式为真,返回重新执行循环体语句,执行循环;直到表达式的判断为假时,循环终止。
其一般形式为:
do
{
循环体语句
}while(表达式);
▲while语句与do-while语句的区别:
while语句在每次循环之前检验条件,do-while语句则在每次循环之后检验条件。
3、for语句:
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
当执行for语句时,程序先计算表达式1的值,再计算表达式2的值,若表达式2的值为真,则执行循环体的内容,并计算表达式3的值;然后检验表达式2,为真,执行循环,如此反复,直到表达式2的值为假,退出循环。
十、转移语句
1、goto语句:
goto语句为无条件转向语句,可以使程序立即跳转到函数内部的任意一条可执行语句;其一般形式为:
goto标识符;。
goto后的标识符就是要跳转的目标,当然这个标识符要在程序的其它位置给出,但是其标识符要在函数内部。
如:
gotoShow;
printf(“第一个”);
Show:
printf(“第二个”);
goto后的Show为跳转的标识符,而其后的Show:
代码表示goto语句要跳转的位置;因此,上面语句中的第一个printf函数不会执行,而会执行第二个printf函数。
▲跳转的方向可向前、可向后;可跳出一个循环,也可跳入一个循环。
十一、数组
1、一维数组(用以存储一维数列中数据的集合)
一般形式为:
数据类型数组名[常量表达式];如:
intArray[5];
△类型说明符表示数组中所有元素的类型。
△数组标识符就是数组变量的名称,命名规则与变量名一致。
△常量表达式定义了数组中存放的数据元素的个数,即数组长度。
如:
intArray[5];
5表示数组中有5个元素,下标从0开始,到4结束==》【不可使用元素Array[5],否则会出现下标越界的错误】。
▲一维数组的初始化:
①在定义数组时可直接对数组元素赋初值,如:
intArray[6]={1,2,3,4,5,6};
②可以只给一部分元素赋值,未赋值的部分元素值为0。
(赋值顺序由前至后)
③在对全部数组元素赋初值时可以不指定数组长度,如:
intArray[]={1,2,3,4}
2、二维数组
一般形式为:
数据类型数组名[常量表达式1][常量表达式2];
其中:
“常量表达式1”被称为行下标,“常量表达式2”被称为列下标。
如:
二维数组intArray[n][m];
其行下标取值范围为0~(n-1),列下标取值范围为0~(m-1)。
△二维数组的最大下标元素是Array[n-1][m-1]。
△下标可以是整型常量或整型表达式。
△不管是行下标还是列下标,其索引都是从0开始的。
▲二维数组的初始化跟一维数组一样,也可以在声明时对其进行初始化
3、字符数组
字符数组的定义与其他数据类型的数组定义类似,一般形式为:
char数组名[常量表达式];
十二、字符处理函数
1、字符串复制
strcpy函数功能:
把源字符数组中的字符串复制到目的字符数组中,字符串结束标志“\0”也一同复制。
其语法格式为:
strcpy(目的字符数组名,源字符数组名);
▲①要求目的字符数组有足够的长度,否则不能全部装入所复制的字符串。
②“目的字符数组”必须写成数组名形式;而“源字符数组”可以是字符数组名,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。
2、字符串连接
strcat函数功能:
把源字符数组中的字符串连接到目的字符数组中字符串的后面,并删去目的字符数组原有的结束标志“\0”。
其语法格式为:
strcat(目的字符数组名,源字符数组名);
▲要求目的字符数组有足够的长度,否则不能全部装入所复制的字符串。
3、字符串比较
strcmp函数功能:
两个字符串从首字母开始,按照ASCLL码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
其语法格式为:
strcmp(字符数组名1,字符数组名2);
▲返回值如:
①字符串1=字符串2,返回值为0;
②字符串1>字符串2,返回值为正数;
③字符串1<字符串2,返回值为负数;
4、字符串大小写转换
strupr函数功能:
将字符串中的小写字母变成大写字母,其他字母不变。
其语法格式为:
strupr(字符串);
strlwr函数功能:
将字符串中的大写字母变成小写字母,其他字母不变。
其语法格式为:
strlwr(字符串);
5、获取字符串的长度
strlen函数功能:
计算字符串的实际长度(不含字符串结束标志“\0”),函数返回值为字符串的实际长度。
其语法格式为:
strlen(字符数组名);
十三、函数的调用
1、函数调用方式(包括:
函数语句调用、函数表达式定义、函数参数定义3种方式)
①函数语句调用:
把函数的调用作为一个语句就叫函数语句调用。
程序如下:
#include
voidDisplay()//定义函数
{
printf(“justshowthismessage。
”);输出信息
}
intmain()
{
Display();//函数语句调用
ruturn0;}//程序结束
②函数表达式定义:
函数出现在一个表达式中,这时要求函数带回一个确定的值,这个值做为参加表达式的运算。
程序如下:
#include
intAddTwoNum(intiNum1,intiNum2);/*声明函数,函数进行加法计算*/
intmain()
{
intiResult;/*定义变量用来存储计算结果*/
intiNum3=10;/*定义变量,赋值为10*/
iResult=iNum3*AddTwoNum(3,5);/*在表达式中调用函数AddTwoNum*/
printf("Theresultis:
%d\n",iResult);/*将计算结果进行输出*/
return0;/*程序结束*/
}
intAddTwoNum(intiNum1,intiNum2)/*定义函数*/
{
intiTempResult;/*定义整型变量*/
iTempResult=iNum1+iNum2;/*进行加法计算,并将结果赋值给iTempResult*/
returniTempResult;/*返回计算结果*/
}
③函数参数调用:
函数调用作为一个函数的实参,这样讲函数返回值作为实参传递到函数中使用。
程序如下:
#include
intAddTwoNum(intiNum1,intiNum2);/*声明函数,函数进行加法计算*/
intmain()
{
intiResult;/*定义变量用来存储计算结果*/
iResult=AddTwoNum(10,AddTwoNum(3,5));/*在参数中中调用函数AddTwoNum*/
printf("Theresultis:
%d\n",iResult);/*将计算结果进行输出*/
return0;/*程序结束*/
}
intAddTwoNum(intiNum1,intiNum2)/*定义函数*/
{
intiTempResult;/*定义整型变量*/
iTempResult=iNum1+iNum2;/*进行加法计算,并将结果赋值给iTempResult*/
returniTempResult;/*返回计算结果*/
}
2、函数的嵌套调用
在C语言中,函数的定义都是平行的、独立的,即在定义函数时,一个函数体内不能包含“定义”的另一个函数;但可以嵌套调用函数。
程序代码如下:
①intmain()
{
voidDisplay()//错误!
不能在函数内定义函数
{
printf(“Thisfunctioniswrong”);
}
}
②voidShowMess()//定义函数
{
printf(“TheShowMessagefuntion”);
}
voidmain()
{
ShowMessage();//正确,在函数体内进行函数的嵌套调用
}
3、递归调用
C语言的函数都支持递归,即每个函数都可以直接或间接地调用自己;所谓的间接调用指在递归函数调用的下层函数中再调用自己。
十四、内部函数和外部函数
1、内部函数
定义一个函数,该函数只被所在的源文件所使用,称这样的函数为内部函数,内部函数又称为静态函数。
定义内部函数,只需在函数返回值类型和函数名前加上关键字static进行修饰:
static返回值类型函数名(参数列表)
▲使用内部函数的好处是:
可以使函数只局限在函数所在的源文件中,如果在不同的源文件中有同名的内部函数,则这些同名的函数是互不干扰的。
2、外部函数
外部函数就是可以被其他源文件调用的函数,定义外部函数,只需在函数返回值类型和函数名前加上关键字extern进行修饰:
extern返回值类型函数名(参数列表)
▲在C语言中定义函数时,若不指明函数是内部函数、还是外部函数,那么默认外部函数,即定义外部函数时可以省略关键字extern。
十五、局部变量和全局变量
1、局部变量
在一个函数的内部定义的变量(或函数的形式参数)是局部变量,局部变量的作用范围仅限于函数内部的所有语句块。
在语句块内声明的变量仅在该语句块内部起作用,当然也包括嵌套在其中的子语句块。
▲局部变量的屏蔽作用:
内层作用域中的变量间屏蔽外层作用域中的那个变量,直到结束内层作用域为止。
2、全局变量
在所有函数外部声明的变量,称为全局变量;全局变量可以在程序中的任何位置进行访问。
▲全局变量不属于某个函数,而属于整个源文件,但如果外部文件要进行使用,则要用extern进行引用修饰。
(全局变量的值的改变会影响所有引用该全局变量的函数)
十六、指针(指针的本质就是一个操作受限的非负整数)
1、指针变量的一般形式:
数据类型*变量名;
2、地址:
地址就是内存区对每个字节的编号。
(指针就是地址,地址就是指针)
3、指针变量:
专门用来存放另一个变量地址的变量是指针变量。
△不同类型的指针变量所占的字节一样,都占4个字节。
4、指针变量的运算
①不能相加、相乘和相除,但可以相减。
▲只有当两个指针变量指向同一块连续的空间中的不同存储单元时,两个指针变量可进行相减(程序如下)
#include
#include
intmain()
{
inta[5],*p,*q;//定义一个一维数组和两个指针变量
p=&a[0];//将一维数组a的首地址赋给p
q=&a[4];//将一维数组a的末地址赋给q
printf(“p和q所指向的单元隔%d个单元\n”,q-p);//将p-q运算的结果输出
system(“pause”);//冻结屏幕,便于观察程序执行的结果
reyurn0;//程序结束
}
5、指针的自加、自减运算
假设指针p指向变量i的地址,如果i数据类型为整型,则执行p++(p--)后,p的值增加(减少)4(4个字节),如果i的数据类型为字符型,则执行p++(p--)后,p的的值增加(减少)1(1个字节),即指针按照它所指向的的变量的数据类型的直接长度进行增或减。
▲使用指针变量之前需先定义且赋予具体的值,未经赋值的指针变量不能使用。
给指针变量赋值只能赋予地址,若赋予任何其他数据,将引起错误。
★注意:
1、处理用户非法输入的代码(即错误的代码):
while((ch=getchar())!
=’\n’)continue;
2、除法/的运算符结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。
如:
16/5==316/5.0==3.20000-13/4==-43/5==0
3、取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与本除数相同。
如:
13%3==113%-3==1-13%3==-1-13%23==-13
4、scanf(“%d”,&a[i]);指从键盘获取一个十进制整数,并赋值给一维数组a[i]。
5、用C语言生成的可执行文件(.exe),运行结果一闪就没了,可在ruturn的语句的上面加system("pause");这条语句解决。
6、如果用+、--、*、/运算的两个数中有一个为实数,那么结果是double型,这是由于所有实数都按double型进行运算的。
7、在C语言中,可以用逗号将多个表达式分隔开来,其中,用逗号分隔的表达式被分别计算,并且整个表达式的值是最后一个表达式的值。
逗号表达式称为顺序求值运算符,一般形式为:
“表达式1,表达式2,…,表达式n”先求解表达式1,再求解表达式2,一直求解到表达式n,整个逗号表达式的值是表达式n的值。
8、printf函数使用的是变量的标示符,而不是变量的地址;scanf函数使用的是变量的地址,而不是变量的标示符。
9、大写字符与小写字符的ASCII码值相差32。
如字符A的ASCII值为65,a的ASCII值为97,即a的ASCII值=A的ASCII值+32。
10、getchar∕putchar函数用于单个字符的输入∕输出,而gets∕puts函数则用于字符串的输入∕输出
11、srand和rand函数都包含在stdio.h头文件中,srand函数的功能是设定一个随机发生数的种子,rand函数式根据设定的随机发生数种子产生特定的随机数。
若在使用rand函数之前不提供种子值,也即不用srand设定种子值,则rand函数总是默认以1为种子,每次产生同样的随机数序列。
12、使用while和do-while语句循环时,循环变量初始化的操作应在while和do-while语句之前完成。
13、break语句不能用于循环语句和switch语句之外的任何其他语句中。
break语句是结束整个循环过程,不再判断执行循环的条件是否成立。
14、continue语句的作用是结束本次循环,即跳过循环体中尚未执行的部分,接着执行下一次循环操作。
continue语句只结束本次循环,并非终止整个循环的执行。
15、排序算法的比较:
插入法、冒泡法、交换法排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度;在这种情况下,择半法排序反而会显得速度慢了。
当排序的数量n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
16、C程序中,不管main()函数在程序的哪个位置,程序都是从此处开始执行、在此结束;若遇到调用其他函数,则转去执行被调用的函数,该函数执行完毕后,重新返回main();只有在main()函数的所有课执行语句执行完毕时,整个C程序才执行完成。
17、函数是C语言的基本单元,在函数内不可再定义其他函数。
18、