首页 > 学院 > 开发设计 > 正文

C语言基础部分

2019-11-08 00:39:32
字体:
来源:转载
供稿:网友

1.C语言常识

C语言程序的绝大部分应该记录在以".c "作为扩展名的文件里,这种文件叫做C语言源文件

C语言程序中还包括以".h "作为扩展名的文件,这种文件叫做头文件

 

C语言程序中绝大多数语句应该写在大括号里面

C语言程序中的大括号可以用来代表一个函数(函数可以看作一组语句)

函数内部的语句一定按照从上到下的顺序执行

C语言程序中不可以没有函数;每个函数都必须有名字,不同函数的名字不能相同

C语言程序中必须包含叫做main 的函数,它叫做主函数

程序一定从主函数的第一条语句开始执行,当主函数里最后一条语句结束时整个程序结束

 

函数结束时可以留下一个数字,这个数字叫做函数的返回值(也可以不留)

主函数应该有一个返回值,如果这个数字是0,表示程序员希望计算机认为程序正常结束了,如果是别的

数字则程序员希望计算机认为它错了。

 

C语言程序中预先保留几十个英文单词,它们叫作关键字。

每个关键字都有特定的用途,不能随意使用,所有关键字一定是由小写英文字母构成

 

return就是一个关键字,它有两个用途,主要用途是结束函数的执行,辅助用途是指定函数返回值的数值

 

计算机根据数字在某个方面的区别把数字分成几组,每组叫做一个数据类型,每个数据类型都有自己的名字。

整数类型是一种数据类型,它的名字是int ,这个数据类型里包含几乎所有不带小数点的数字

程序中的所有数字必须有数据类型,程序中所有不带小数点的数字都被默认成整数类型

 

C语言中规定函数如果有返回值则必须把返回值的类型名称写在函数名称前

C语言程序中通常包含预处理指令

预处理指令一定是以"#"作为开头,并且不是以";"作为结尾

标准C阶段遇到的预处理指令会把源文件里的内容替换成其他内容

#include预处理指令可以把一个头文件的内容包含到当前文件中

这个指令需要使用相对路径表示被包含的头文件所在的位置

把相对路径包含在<>里,表示采用系统中预先准备好的一组目录作为起点

把相对路径包含在""里,表示首先把当前文件所在目录作为起点使用,然后再把系统中预先准备好

的目录作为起点使用

 

C语言程序中可以加入文字性的说明信息,这些信息必须加入到注释区域里

计算机会直接忽略注释区域里的所有内容

单行注释以"//"作为开头一直到行尾;多行注释以"/*"作为开头,以"*/"作为结尾

 

C程序中大量使用名字区分不同内容,这些名字叫做标识符;标识符最好采用英文单词

标识符的编写规则:

1.第一个字符应该是英文字母或者下划线

2.后面的每个字符可以是英文字母,下划线或者阿拉伯数字字符

3.大小写不同的标识符是不一样的(大小写敏感)

4.关键字不可以作为标识符使用

5.标识符长度没有限制,但是计算机只能截取前面一部分使用

 

C语言程序编码规范

1.一行里最多包含一条语句

2.同级别的语句应该上下对齐(也就是语句左边那一列对齐)

3.在合适的地方使用空格和空行

4.编写标识符的时候可以采用驼峰方式或者下划线方式,以此来利于标识符之间的区分,便于理解

 2.C语言编译与链接

编译器可以把源文件翻译成计算机能够认识的格式

gcc是linux系统里C语言程序的编译器

MinGw是Windows下的gcc(可以下载该软件,然后在Windows下就可以使用gcc命令了)

 

Linux系统中C语言程序开发基本过程

1.使用vi 编写源文件

2.使用gcc把所有源文件翻译成可执行文件(编译)

3.使用命令"./a.out " 执行得到的新文件

 

gcc编译器工作过程

1.处理所有预处理指令(其处理结果就是得到一个新的源文件)

2.把第一步处理结果翻译成计算机认识的格式(这一步也叫做“编译”)

3.把第二步的处理结果合并成可执行文件(链接)

 

gcc选项介绍

“ -E ” 只处理所有预处理指令(也就是只完成第一步);也就是使用语句“gcc -E  .c文件”

“-c ”只完成预处理和编译工作,处理结果是以“.o ”作为扩展名的目标文件

“-o”用来指定得到的执行文件名称,使用“gcc  .c文件 –o  指定的文件名 ”

 

“-std=c89”,“-std=c99”这个选项决定采用什么版本的规范进行编译,默认采用c89规范,

后者比前者功能更强,并且兼容前者

 

C语言中提供工具,它们叫做标准函数,每个标准函数用来解决一个常见的问题,不同标准函数的名称不同

可以在程序中编写函数调用语句使用标准函数

 

PRintf”标准函数可以把程序中的结果打印在终端窗口里,使用“printf(“ 整数”)”,使用“printf(“ 整数/n”)”可以使打印出的整数单独占一行

为了使用这个标准函数需要包含“stdio.h”的头文件

 

可以在双引号里使用占位符把数字转移到双引号的后面,使用“printf(“%d“,整数)”

在打印之前计算机会用双引号后面的数字依次替换占位符,替换完后才进行打印

不同类型的数字应该和不同占位符配合使用,整数类型数字应该和“%d”配合使用

可以在一条打印语句中使用多个占位符,这时就应该在双引号后面提供相应的多个数字,数字个数应该和占位符的个数一样。计算机会依次使用这些数字替换前面的占位符。

如“printf(“a%db%dc/n”,1,2)”,会打印出“a1b2c”

双引号后面的数字可以是一个计算公式,计算机会首先计算出结果,然后替换前面的占位符

 

程序中使用的所有数字必须记录在内存里

计算机内存由大量字节组成,每个字节可以单独记录一个数字

每个字节有一个编号,不同字节的编号不同。这个编号叫做字节的地址

所有字节的地址从0开始向上递增,只能通过地址找到字节。

内存中几个相邻的字节可以合并成一个整体,用来记录一个数字

 

我们可以把内存中用来记录一个数字的所有字节称为一个存储区(只在本课中使用,为了教学方便)

一个存储区只能用来记录一种类型的数字

存储区也有地址,这个地址就是内部包含的所有字节中地址最小那个字节的地址

 

C语言程序中可以使用变量代表存储区

对变量的操作就是对它所代表存储区的操作

程序中所有变量必须先声明然后才能使用,变量声明语句可以用来声明变量

变量声明语句会让计算机为程序分配一个存储区

 

变量有两种使用方法:

1.向变量代表的存储区里放一个数字

 (赋值语句可以向变量里放一个数字,赋值语句的核心就是赋值操作符“=”,

   赋值操作符左边代表存储区的内容,这种内存叫左值,变量是最简单的左值。

   赋值操作符右边应该写一个代表数字的内容

   赋值语句可以把右边的数字放在左边的存储区里

   可以在声明变量的时候立即对变量进行赋值,这叫做变量的初始化

   C语言里所有变量都应该初始化

2.从变量代表的存储区里获得数字

  (可以在程序中直接把变量当作数字使用,

    计算机会首先从变量代表的存储区里获得数字,然后用这个数字参与其他计算)

 

变量名称既可以代表变量的存储区也可以代表那个存储区里的数字,由环境决定

 

程序中使用变量名称时,编译器负责计算对应存储区的地址

在变量名称前加“&”可以计算出变量对应存储区的地址

可以使用“%p”作为占位符把地址数据打印在屏幕上

 

可以在一条语句中声明多个同类型变量

 

变量可以用来代表一个固定数字

 

变量真正的价值所在,是其可以用来代表一组数字,

这些数字任何时候只使用其中一个,且这些数字符合同样的规律,

应该可以采用同样的处理方式

 

 字符类型是一种数据类型,它的名称是“char”

字符类型里包含256个不同的整数,每个整数可以代表一个字符数据

(例如‘a’,‘^’等)

整数和字符仅仅是两种不同的表示方式,但表示的内容是一样的

ASCII码表中列出了所有整数和字符之间的对应关系

ASCII码表中所有小写英文字母是连续排列的,其中‘a’的整数最小,‘z’的整数最大

             所有大写英文字母阿拉伯数字字符也都符合这个规律

 

所有字符数据被分成两组,每组包含128个

其中一组字符数据两种表示方式之间的对应关系

在所有计算机上都是一样的,它们的整数范围从0到127

另外一组字符数据两种表示方式之间的对应关系在

不同计算机上是不一样的,它们的整数范围可能从-128到-1,

也可能从128到255

所以在计算机中不要轻易将字符类型当作整数类型来使用

 

无符号字符类型也是一种数据类型,

它的名字是“unsignedchar”

它同样包含256个不同的字符数据,这些数据的

整数范围在所有的计算机上都是从0到255

所以这种类型的字符可以当作整数类型来使用

 

‘/n’ 代表换行字符

‘/r’ 代表回车字符

‘//’ 代表字符/

‘/' ’代表字符'

‘/'' ’代表字符''

 

短整数类型也是一种数据类型,里面包含65536个不同的整数

它的名称是“short”

其中一半是非负数,另一半是负数,

以数字0为中心向两边扩展

无符号短整数类型也是一种数据类型,它的名称是“unsignedshort”

它里面也包含65536个不同的整数,从0开始向正数方向递增,不含负数

 

长整数类型也是一种数据类型,其名称为“long”或着“long int”

里面包含2的32次方个不同的整数,其中一半是负数,另一半是非负数

以0为中心向两边扩展

无符号长整数类型名称是“unsignedlong”或者“unsignedlong int”

里面包含2的32次方个不同的整数,从0开始向正数方向扩展,不包括负数

 

整数类型名称是“int”

一般情况下,整数类型和长整数类型一样

无符号整数类型名称是“unsignedint”

一般情况下,无符号整数类型和无符号长整数类型一样

 

所有只包含整数的类型,它们的数字范围是

重叠的,并且逐级扩大

在程序中不带小数点的数字后加“u”表示这个数字是无符号整数类型

 

C语言程序中使用浮点类型表示带小数点的数字

浮点类型分为单精度浮点类型和双精度浮点类型

双精度浮点类型可以记录更多小数点后面的数位

单精度浮点类型的名称可以用“float”

双精度浮点类型的名称是“double”

 

程序中带小数点的数字计算机默认它的类型是“double”型

如果在带小数点数字后加“f”表示这个数字的类型是单精度浮点类型

 

C语言中允许程序员扩展新的数据类型

这些新的数据类型统称为复合数据类型

复合数据类型需要先定义然后才可以使用

 

布尔类型是C99规范中引入的新的数据类型

布尔类型中只包含两个整数,一个是真,另一个是假

计算机中用“1”表示真,用“0”表示假

任何一个整数都可以当作布尔值使用,“0”当作布尔值

使用时,当作假,其他所有整数当作布尔值使用时都是真

一般在程序中,不需要使用这个数据类型,直接用整数代替就可以

 

数据类型和占位符的对应关系

char 和 unsigned char    用 %c  表示   占据一个字节

short                             用%hd      占据两个字节

unsignedshort              用%hu            两个字节

long                               用%ld             4个字节

unsignedlong                   %lu             4个字节

int                                     %d              4个字节

unsignedint                     %u               4个字节

float                                 %f 或者%g     4个字节

double                              %lf 或者%lg    8个字节

 

%f 和%lf 会保留小数点后面多余的0

%g 和%lg 不会保留

例如打印“3.20”,前者会将其所有可以打印的“0”给打印出来,

而后者只会打印“3.2”

 

不同数据类型的一个主要区别就是存储区里包含的字节个数不同

 

sizeof 关键字可以用来计算一个存储区或者数据类型中包含的字节个数

sizeof()的括号里可以写任何能当数字使用的内容

sizeof()的工作方式不是以函数的方式工作的,所以它不是一个函数,而是一个关键字

sizeof小括号里如果修改了任何存储区中的内容,这个修改不会真正生效

 

scanf 标准函数可以把用户在键盘上输入的数字记录在变量代表的存储区里

为了使用这个标准函数,也需要包含<stdio.h>头文件

在scanf函数调用语句中要使用存储区的地址表示存储区

双引号里使用占位符表示存储区的类型,如scanf("%d",&num)

在scanf函数调用语句的双引号里不要写占位符以外的其他内容,

否则容易出现意想不到的结果

可以在一条scanf函数调用语句中得到多个数字,如scanf("%d%d",&num,&num1)

如果用户输入的格式和程序要求的格式不一致,就可能得不到正确的数字

 

一个字节分成八段,每段只能记录一个0或者1

要想把一个数字记录在一个字节中,就必须首先把这个

数字拆分成八个0或者1

采用一组0和1表示数字的方法叫做二进制

二进制表示方式中,每个位置有一个编号,最右边位置的

编号是0,向左以此递增

某个位置上的1代表的数字是2的位置编号次方

在二进制表示方式中,如果两个相邻位置上的内容一样,

则左边的数字是右边数字的2倍

(以上规则只适用于用二进制表示的非负数)

 

二进制数字加1时,把最右边的所有1都变成0,把最右边的0变成1

 

不停对数字除以2保留整数部分的操作,得到一组数字,其中每个数字在作

除以2取余得到每个数位上的内容。把所有余数按找从后向前倒叙书写

就得到转换结果。

 

负数十进制转换为二进制

1.得到负数的相反数

2.把第一步的结果转换成二进制

3.把第二步每个数位上的内容变成相反值

4.把第三步的结果加1

 

采用按位求反再加1的方法可以根据任何二进制数计算出相反的二进制数

 

有符号类型二进制最左边的数位叫做符号位

根据它可以知道数字的正负,如果符号位是0则数字是非负数,

如果符号位是1则数字是负数

 

负数的二进制转换成十进制

1.首先计算出相反数的二进制

2.把第一步的结果转换成十进制

3.根据第二步的结果再计算相反数

当把占地大的整数赋值给占地小的整数类型存储区

的时候,只保留最后的二进制数位,这将导致数据丢失

 

 

当把占地小的有符号类型整数赋值给占地大的整数类型存储区时,扩展出来的二进制数位填充的都是符号位(不仅第一位是符号位,扩展出来的位数都是符号位)

这样会保持十进制结果不变

 

把二进制从右向左每三个数位分成一组,每组用0到7之间的一个数字替代

这个结果叫做数字的八进制表示方式

二进制与八进制之间的转换没有正负之说,也就是说它们的转换规则是一样的

可以在程序中直接使用八进制方式表示数字,但必须以0(数字0)作为开头

也就是说0之后才是表示的八进制数字

可以采用%o(字母o)作为占位符,把数字的八进制表示方式打印在屏幕上

 

把二进制数字从右向左每四个数位分成一组,每组用一个字符替换

(用a到f这六个字母代表10到15)

可以在程序中使用十六进制方式表示数字,必须以0x(数字0,字母x)作为开头

可以用%x或者%X做占位符把十六进制表示方式打印在屏幕上

打印结果不是以0x作为开头的,为了避免和十进制表示的数字冲突,我们可以

自己将0x加在打印结果的开头

以%x作为占位符时,打印结果中英文字母都是小写的

以%X作为占位符时,打印结果中英文字母都是大写的

 

 

操作符用来描述对数字的处理规则

根据操作符所需要的数字个数,把操作符

分成单目操作符、双目操作符、三目操作符

 

如果参与除法计算的两个数字都是整数,则结果只保留整数部分

C语言中使用%表示取余操作

 

赋值操作符用=表示,可以把一个数字记录到一个存储区里

赋值语句可以当做数字使用,这个数字就是赋值完成以后存储区里的数字

可以在一条语句中使用多个赋值操作符,这个时候先计算右边的赋值操作符

 

绝大多数双目操作符可以和赋值操作符合并形成复合赋值操作符,

如+=,%=

复合赋值操作符要求左边能代表一个存储区,右边可以代表数字

这个操作符首先把两边都当作数字使用,按照双目操作符的规则

进行计算,最后把计算结果记录在左边的存储区里

复合赋值操作符的优先级和赋值操作符优先级一样低

 

自增操作符(++),自减操作符(--),都是单目操作符

这两个操作符必须和存储区配合使用(不能和数字配合使用),它们可以把存储区的内容做加1或者减1操作

它们各有两种使用方法,一种是前操作(操作符写在存储区前面)

另一种是后操作(操作符写在存储区后面)

如果运算式中只有自增操作符时,二者没有区别

如果这个操作符编写的表达式当做数字使用时,

前操作当数字使用时,是修改后的数字

后操作当数字使用时,是修改前的数字

 

不要在一条语句中对同一个变量作多次自增自减运算,其结果是不确定的

 

 

逻辑操作符用来编写逻辑表达式

逻辑表达式的计算结果一定是布尔值

 

! 是一个单目逻辑操作符,它表示对一个布尔值求反(真变假,假变真)

这个操作符使用的时候要写在一个布尔值的前面

 

双目逻辑操作符包括==(等于),!=(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于)

 

最多包含一个双目逻辑操作符的表达式叫做简单逻辑表达式(为了讲课方便而自己创作的)

C语言中如果一个逻辑表达式里包含多个双目逻辑操作符则必须拆分成多个简单逻辑表达式,然后再合并

 

 

可以使用“与”(&&)和“或”(||)把两个逻辑表达式合并成一个新的逻辑表达式

如果两个逻辑表达式的结果都是真,则用“与”(&&)连接后结果才是真,否则为假

如果两个逻辑表达式的结果中有一个是真,则用“或”(||)连接后的结果就是真,否则是假

“与(&&)”和“或(||)”都具有短路的特性(如果前一个表达式可以决定整个表达式的结果,则后一个逻辑表达式根本就不计算)

 

 

位操作符可以直接操作二进制数位

“~”是一个单目位操作符,它可以把二进制中的每个数位求反(按位求反)

这个操作符应该写在一个数字前面

双目位操作符包括“按位与”(&),“按位或”(|),“按位异或”(^)

它们可以把两个数字对应二进制数位上的内容进行计算

“按位与”(&)可以把对应二进制数位进行与计算,只要一个数位的内容是0则结果就是0

“按位或”(|)可以把对应二进制数位进行“或”计算,只要一个数位的内容是1,则结果就是1

“按位异或”(^)可以把对应二进制数位进行“异或”计算,如果两个数位内容一样,则结果就是0,否则结果是1

 

移位操作符可以把一个数字中的所有二进制数位统一向左或向右移动n个位置

“>>”表示向右移位操作

“<<”表示向左移位操作

二者都是双目操作符,操作符左边是将要进行移位操作的数字,右边是移动的位数

移位操作相当于将每个数位上的内容放到了另外一个数位里

移位操作不会修改任何存储区的内容,它会得到一个新数字,这个新数字即是移位操作以后的结果

向左移位时,右边空出来的位置上一定补0

有符号类型数据向右移位时,左边空出来的位置上补充符号位

无符号类型数据向右移位时,左边空出来的位置上补充0

一般情况下(也就是移位时要保证有效数位不丢失),向左移动n个位置相当于数字乘以2的n次方,向右移动n个位置相当于除以2的n次方

 

 

 

&也可作为单目操作符来使用,这个时候它可以用来计算一个存储区的地址,

这个操作符应该写在一个存储区的前面

可以使用“%p”作为占位符把地址数据打印在屏幕上,

打印结果是一个十六进制数字,并且自动在结果前面加上0x

 

“*”也可以作为单目操作符使用,这个时候它可以根据地址数据找到对应的存储区

这个操作符应该写在一个地址数据的前面

 

三目操作符可以从两个计算规则中选择一个使用

三目操作符格式如下:

布尔值?公式一 : 公式二

如果布尔值为真,则采用公式一计算结果,否则采用公式二计算结果

 

不要在问号后面写赋值操作符

 

如果表达式中所包含的数字类型不同,则计算机会首先把他们转换成同一类型,然后才进行计算

这个转换过程叫做隐式类型转换,完全由计算机完成

在隐式类型转换中一定把占地小的类型转换成占地大的类型

 

如果不同数字的大小一样,则把整数类型转换成浮点类型,把有符号类型转换成无符号类型

 

在C语言程序中可以给数字指定一个类型,这叫做强制类型转换

强制类型转换语法如下:

(char)num 表示将num变量当做字符型变量使用

强制类型转换有可能造成数据丢失

 

类型转换不会修改任何存储区的内容,计算机会使用一个新存储区记录转换后的数字,然后用这个新存储区做其他计算

 

分支语句可以从几组语句中选择一组执行

“if”关键字可以用来编写分支语句

if分支使用一个布尔值决定一组语句是否要执行,如果布尔值为真则执行,否则就不执行

 

如果多个分支中任何两个都不可能同时执行,就可以使用“else”关键字把它们合并

 

如果合并好的多个分支中必然会执行一个,则可以省略最后一个分支的逻辑表达式

 

合并好的多个分支,逻辑表达式之间有前后顺序,只有当前面的逻辑表达式结果为假,才会计算后面的逻辑表达式

 

在合并多个分支的时候,可以利用这一点简化逻辑表达式

已经合并好的分支不可以当作多个无关分支来理解,因为合并后已经将逻辑关系给简化了

 

 

如果一个分支里包含有限个整数,每个整数使用专门的语句处理,这种分支可以采用

“switch...case”的方法实现

 

 

循环语句可以让同样一组语句反复多次运行

“for”关键字可以用来编写循环

for循环中可以让一个变量依次代表一组数字,然后使用同样一组语句处理每个数字

这个变量叫做循环变量

采用如下结构描述循环变量的变化过程:

(①;②;③)

①把开始数字赋值给循环变量

②用逻辑表达式描述循环变量和结束数字的关系

③循环变量的变化规律

 

假如有如下for循环

for(1;2;3){

     4

}

它按照如下方式分组执行:

[1,2][4,3,2][4,3,2].....[4,3,2]

只有第一组与其他组不同

正常情况下for循环一定是在两组之间结束的

如果某一组最后编号为2的逻辑表达式结果为真则启动下一组,否则结束循环

如果循环正常结束则结束后循环变量一定落在范围之外

for循环执行时有可能不执行大括号里的语句

 

for循环小括号里的每一部分都是可以省略的

 

如果小括号里的逻辑表达式没有写则表示这个逻辑表达式的结果永远为真。这种循环不能正常结束,所以叫做死循环。

 

小括号最前和最后的部分可以是用逗号连接的多条语句

 

C99规范中允许在小括号里临时声明循环变量

这个循环变量只能在循环里使用,循环结束后就不能用了

 

可以在循环中使用“break”语句,立即结束循环的执行

一旦执行了“break;”语句,循环中的一切语句都不再执行,循环变量也不会再变化。

如果循环采用“break;”语句结束,则结束后循环变量在范围内

break语句只会结束直接包含它的循环。

 

可以在循环中使用“continue;”语句,直接跳到循环大括号的末尾,中间所有的语句这次都不执行了

 

如果编写循环的时候无法计算出循环需要执行的次数,那么就可以编写一个死循环,在循环中使用分支和“break;”语句结束循环。

 

 

无法预先知道的数字叫做随机数

 

“rand()”标准函数(括号中没有参数)可以用来获得随机数,为了使用这个标准函数需要包含“stdlib.h”头文件

 

“srand()”标准函数用来设置随机数种子,这个函数把一个整数作为种子使用,将这个函数单独放在一条语句中使用。

为了使用这个标准函数也需要包含头文件“stdlib.h”

为了保证“srand( )”函数只执行一次,一般把其放在主函数的开头,

该函数相当于种树,所以只应该执行一次,如果多次执行,所得结果是一样的。

 

“time()”标准函数可以用来获得当前时间

为了使用这个标准函数需要包含“time.h”头文件

这个整数的解释是这样的:从0时区1970年0时0分0秒到现在一共经历的秒数。

使用时用time(0)来表示把当前时间来当作种子使用,注意括号中的0并不是数字0的意思

 

 

分支和循环都是流程控制语句,它们都可以让程序中的语句不再从上到下的顺序执行

 

“goto”语句也是流程控制语句,它可以把任意一条语句指定成下一条语句

一般不建议使用该语句,因为该语句很危险。

 

循环里面还可以再写循环,这种结构叫做多重循环

如果一个问题不容易直接解决,但是它可以被分解成几个小问题,而且每个小问题的解决方法非常类似。那么这种问题就可以采用多重循环的方式来解决。

 

“while”关键字也可以用来编写循环,这种循环可以用来实现无法预知次数的循环

while循环格式如下:

while(逻辑表达式){

反复执行的语句

}

只要逻辑表达式结果为真,大括号里的语句就反复执行。

while循环的逻辑表达式写成1就成了死循环

while循环里也可以使用“break;”和“continue;”语句。

while循环中逻辑表达式的判断和语句的执行是交替进行的,永远先判断逻辑表达式

while循环有可能不会执行任何语句。

 

do...while格式也可以用来实现循环

可以把do...while格式看成while格式的变体

do...while格式里必须在最后的小括号后面加“;”

do...while循环中逻辑表达式的判断也是和语句的执行交替进行,只不过永远后判断逻辑表达式。

do...while循环中语句至少会执行一次

 

在不同速度的设备之间传递数据需要使用缓冲区

“scanf()”函数工作时需要使用一个叫做“输入缓冲区”的缓冲区

用户在键盘上输入的内容首先进入输入缓冲区,程序从输入缓冲区里获得数字

先进入输入缓冲区的数字必须首先被处理

如果用户输入的格式和程序要求的格式不一致,则会导致从这个数据开始的所有数据都无法处理了。

 

可以使用如下两条语句把输入缓冲区里的错误数据给丢弃

scanf(“%*[^/n]”);//把输入缓冲区里第一个换行字符前的所有内容丢弃

scanf("%*c");//把换行字符丢弃

 

printf函数使用了输出缓冲区

输出缓冲区里的内容在如下四种情况下才会显示在屏幕上:

1.如果输出缓冲区里有‘/n’换行字符则它前面的所有内容显示在屏幕上(此时不管程序是否结束)

2.程序结束后所打印的内容会显示在屏幕上

3.当输出缓冲区被充满的时候里面的内容会显示在屏幕上

4.在程序中使用“fflush(stdout)”语句可以把输出缓冲区里的内容显示在屏幕上

 

 

数组可以用来代表内存中一组连续的同类型存储区

数组也需要先声明然后再使用

声明数组的时候,需要提供类型名称和数组名称,除此之外还需要一个存储区个数

任何数组一旦存在则里面包含的存储区个数就不可以改变了

数组一般不可以作为整体使用,通常一次只能使用其中的一个存储区

数组中每个存储区有一个编号,这个编号叫做数组的下标。

第一个存储区的下标是0,向后依次递增。

下标范围从0开始到个数减1为止,超过范围的下标不可以使用

下标就可以用来表示数组中的存储区

 

可以使用for循环依次处理数组中每个存储区

在这个循环里循环变量依次代表每个存储区下标

 

数组应该进行初始化,并满足如下规则:

1.数组初始化的时候应该把初始化数据写在一对大括号里,不同数字之间使用‘,’隔开。

2.计算机把所有初始化的数据按照从前到后的顺序依次初始化数组中的每个存储区

3.如果初始化数据个数多余存储区个数,则多余的数据被自动忽略

4.如果初始化数据个数少于存储区个数则后面的存储区自动被初始化为0

5.如果初始化数据个数和存储区个数一致,则可以省略数组声明语句中的个数

 

数组名称不能代表任何存储区

数组名称代表数组中第一个存储区的地址(是一个数)

而变量名称可以代表存储区和存储区内的数字

可以对数组名称进行sizeof计算,结果是数组中所有存储区所包含字节个数的总和

 

C99规范中允许使用变长数组

声明变长数组时可以使用变量表示存储区个数

如果多次运行这个程序则每次数组中包含的存储区个数可能不同

每次程序运行过程中数组中存储区个数不会变化

变长数组不可以初始化

可以采用sizeof关键字计算变长数组的大小

 

多维数组可以用来描述存储区的分组情况

一维数组不能描述存储区的分组情况

二维数组是最常见的多维数组,二维数组只描述了一次分组情况

声明二维数组时需要提供两个整数,前一个整数表示分组个数,后一个整数表示每组中存储区个数

使用二维数组时,需要提供两个下标,前一个下标用来表示分组编号(组下标)后一个下标用来表示组内存储区编号(组内下标)

组下标的范围从0开始到分组个数减1为止

组内下标的范围从0开始到组内存储区个数减1为止

可以采用一维数组初始化的方法对二维数组进行初始化(就是在大括号中将数字分别用逗号‘,’隔开)

也可以在初始化的时候对初始化数据进行分组,每一组用来初始化一组存储区(就是在大括号里再用另外的大括号进行分组)

如果可以根据初始化数据计算出分组个数则可以省略声明中的分组个数(但组内个数是不能省的)

 

数组名称只能代表数组中第一个存储区的地址

数组名称不可以被赋值

二维数组名称使用时也可以只提供一个下标,这种写法表示下标对应组中第一个存储区的地址

有时候可以使用这个写法代表这一组存储区

 

C语言中可以采用分组的方式管理程序中的语句,我们把每个分组叫做一个函数

 

多函数程序的执行模式如下:

1.整个程序的执行时间被划分成几段,不同段被分配给不同的函数使用

2.所有时间段之间不能重叠而且必须连续

3.如果函数A在工作工程中把一段时间分配给函数B则函数B完成工作后必须把时间还给函数A

 

如果函数A在工作过程中把时间分配给函数B,则它们之间存在函数调用关系

在这个关系中,函数A叫做调用函数,函数B叫做被调用函数

函数调用关系是有时间范围的,只要被调用函数已经开始但还没有结束则调用关系存在

 

函数调用语句可以在程序执行过程中产生函数调用关系

 

一般情况下,一个函数不能使用其他函数的存储区

如果函数被分配了多段时间,则不同时间段内使用不同存储区

不同函数内部的变量可以重名

 

函数调用过程中通常伴随着函数之间的数据传递

函数传递存在两个完全相反的方向,既可以从调用函数向被调用函数传递,也可以从被调用函数向调用函数传递

无论哪个方向的数据传递都需要记录在被调用函数提供的存储区里

 

从被调用函数只能向调用函数传递一个数据,这个数据叫做被调用函数的返回值

 

函数的返回值必须记录在被调用函数提供的一个存储区里,这个存储区的类型名称应该写在函数名称前

如果函数不提供这个存储区,则必须在函数名称前写“void”

如果函数名称前什么都没写,则C89规范中规定表示函数提供了一个整数类型的存储区,而C99规范中不允许这样

 

被调用函数里使用“return”关键字向这个存储区里放返回值数据(这是被调用函数使用该存储区的唯一方式)

调用函数可以把函数调用语句当作数字使用,这就可以得到这个存储区里的返回值(这是调用函数使用该存储区的唯一方式)

这个存储区不可以用来长期保留数字,得到返回值以后或者立刻使用或者存储到其他存储区里

如果被调用函数没有使用“return”关键字向这个存储区里放数字,则存储区里的数字是随机的

 

“return”语句既可以返回函数值,也可以表示结束一个函数的执行。

 

 

 

被调用函数不可以采用数组记录返回值,这就意味着函数名前不能写成数组类型

任何函数只能使用单一的存储区作为自己的返回值

 

为了从调用函数向被调用函数传递数据也需要被调用函数提供一组存储区,这些存储区的个数和类型可以是任意的

可以在被调用函数名称后的小括号里声明一组变量,这些变量就用来表示上面提到的存储区

如果声明多个变量,就用逗号“,”分来

这些变量叫做函数的形式参数,小括号里的整体叫做形式参数列表

每个形式参数的类型名称都不可以省略,即使这些参数的类型一样

 

调用函数不能直接使用这些存储区,调用函数只提供一组数(称为“实际参数”),计算机将这些实际参数记录在形式参数的存储区里,然后被调用函数就可以像使用普通变量一样使用这些形式参数

只要能当作数字使用的内容,都可以作为实际参数来使用

 

函数可以不提供这组存储区,此时应该在函数名称后的小括号里写“void”

如果函数名称后面的小括号里什么都没写,则表示函数可以提供任意多个任意类型的形式参数

 

数组可以作为形式参数使用(仅仅把形式参数写成数组声明的格式,但是真正的形式参数不是数组

 

数组形式参数中包含的所有存储区都不是被调用函数提供的,但是被调用函数可以使用(调用函数当然也可以使用)

使用数组作为形式参数可以让被调用函数使用其他函数提供的存储区

 

可以利用数组形式参数实现双向数据传递,这种参数叫做“输入输出参数”

 

数组做形式参数的时候可以省略数组声明里的存储区个数(因为真正的形式参数并不是数组)

数组做形式参数的时候需要另外提供一个形式参数表示数组里的存储区个数(以免进行非法操作,也就是避免超出数组的维度)

 

C语言中函数参数的个数可以是不确定的,这种参数叫作变长参数

变长参数不能在编写函数的时候命名

被调用函数里需要使用特殊的方法获得没有命名的参数

如果编译器首先遇到函数调用语句,则它会猜测函数的格式,这个猜测的结果叫做函数的隐式声明

所有函数的隐式声明都包含一个整数类型的存储区用来存放返回值,包含任意多个任意类型的形式参数

 

隐式声明中所有参数的类型或者是整数或者是双精度浮点类型

 

如果隐式声明的格式和函数的实际格式发生冲突,则编译的时候会报错。

 

任何函数可以分为函数声明函数体这两部分

函数声明是可以单独写成一条语句的

函数声明语句里可以省略形式参数名称,但类型不能省略

可以把函数声明语句单独写在文件开头,这叫做“函数的显示声明

函数的显示声明可以避免隐式声明

 

除了主函数之外的所有函数都应该进行显示声明(主函数之所以不需要函数声明,是因为主函数不会成为被调用函数而被其他函数调用)

 

“return”关键字可以随时结束函数的执行,只需使用语句“return;

 

exit()标准函数可以随时结束整个程序

为了使用这个函数需要包含stdlib.h文件

这个函数需要一个整数类型的实际参数,这个参数用来告诉计算机程序的结束方式,数字“0”表示程序正常结束,其他整数表示遇到问题。

 

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表