C语言(基础语法)
---------------C语音程序设计 立体化教程 — 人民邮电出版社--------------
第一章 c语言概述
c语言特点
- c语言是一种极具生命力的语言。
- c语言具有结构语言的特点,程序之间很容易实现段的共享。
- c语言的主要结构成分是函数。
- 运算符丰富。
- 数据类型丰富。
- 比较接近硬件。
- 语法限制少和程序设计自由度大。
- 生成目标代码质量高、程序执行效率高。
- 可移植性好。基本不做修改就能用于各种型号的计算机的各种操作系统。
说明:
- 每一个c语言源程序都必须有且只有一个主函数。
- 一个函数由两部分组成:函数的首部和函数体。
- 函数体由大括号“{}”括起来。
- 函数调用语句,printf函数的功能是将要输出的内容送到显示器去显示。
- 双引号内的字符串按原样输出,但“\n”是转义字符,代表换行。
说明:
- #include称为文件包含命令,扩展名为.h的文件称为头文件,利用<>或者双引号" "括起来,表明将该文件包含到程序中来,成为程序的一部分。
- 每一个说明,每一条语句都必须以分号结尾。但预处理命令,函数头和花括号“ } ”之后不能加分号。
- 一行内可以书写多个语句。例:“x=2,y=3;”
- //表明注释部分,也可写成 /* … * /
c语言基本结构
概括地说,一个c语言源程序可由如下5部分组合而成:
- 预处理部分(文件包含属于预处理内容)
- 变量说明部分
- 函数原型声明部分
- 主函数部分
- 自定义函数部分
注意:
- 并非所有的c语言源程序都必须包含上述5个部分,一个最简单的c语言程序可以只有包含文件的部分和主函数部分。
- 每个c语言源程序总是从主函数开始执行,且总是在主函数中结束执行。
- 每个c语言源程序可以有零个或多个自定义的非主函数,自定义非主函数的形式与主函数形式相同,只是它的名称不能是main。
c语言程序的开发过程
常见错误
- 没有加入头文件stdio.h
- 主函数首字母大写
- 语句结束后忘记加分号
- 英文状态下的双引号打成中文状态下的双引号
第二章 c语言数据与运算
基本数据类型
特点:其值不可以再分解为其他类型,它是自我说明的。
构造数据类型
种类:数组类型、结构体类型、共用体(联合)类型、枚举类型
指针类型
用来表示某个变量在内存储器中的地址
空类型
调用自定义函数时,调用后并不需要向调用者返回函数值
标识符
标识符是对变量名、函数名、标号和其他各种用户定义的对象命名。
命名规则:标识符由字母、数字或者下划线组成,且第一个字符必须是字母或者下划线。
注意:
- 标识符区分大小写
- 标识符的有效长度取决于具体的c编译系统
- 标识符的书写一般采用具有一定实际意义的单词
- 标识符不能与c语言的关键字同名,也不能与自定义函数或者c语言库函数同名
关键字
关键字是具有固定名字和特定含义的特殊标识符,也称保留字,不允许程序设计者将它们另作别用。
c语言中大约有32个关键字
数据类型定义:typedef
数据类型:int long short struct union unsigned void signed volatile auto extern register static char const double enum float
运算符:sizeof
语句:break continue default do else for goto if return switch while
直接常量
- 整数常量:十进制整数、八进制整数、十六进制整数
(1)十进制整数:每位数0-9,
(2)八进制整数:最高位是0,每位数是0-7
(3)十六进制整数:以0x或0X开头,每位数字位可以是0-9、A-F - 实数常量:也叫浮点型,实数常量也叫实数或浮点数。在C语言中只用十进制表示。
(1)十进制数形式:必须有小数点。
(2)指数形式:e或E之前必须有数字,指数必须为整数。 - 字符常量:只能用单引号括起来,只是单个字符,不能是字符串。
常用转义字符
\n:换行
\t:横向跳格(跳到下一个输出区)
\b:退格
\r:回车
\f:走纸换页
\:反斜杠字符
|’:单撇号字符
":双撇号字符
\a:报警,相当于“007”
\ddd:1-3位8进制数所代表的字符
\xhh:1-2位16进制数所代表的字符
符号常量
c语言中,可以用一个标识符来表示一个常量,称之为符号常量。
一般形式:#define 标识符 常量
注意:
宏定义必须以#define开头,标识符和常量之间不加等于号,行末不加分号。
宏定义#define应该放在函数外部,这样可以控制程序结束。
符号常量的标识符用大写字母,变量标识符用小写字母,以示区分。
变量
变量在使用前必须定义,变量在内存中占据一定的存储单元。
整型变量
- 基本型:int,在内存中占4个字节。
- 短整型:short int 或 int,在内存里占2个字节。
- 长整型:long int 或 long,在内存中占4个字符。
- 无符号型,unsigned
说明:(书写规则)
类型说明符与变量之间至少要有一个空格间隔。
定义多个相同类型的变量,但变量间要用逗号间隔。
必须用分号“ ;”结束。
实型变量
- 单精度:float,在内存中占4个字节,有效数字6-7位。
- 双精度:double,在内存中占8个字节,有效数字15-16位。
说明:书写规则与整型相同
说明:
实型变量由有限的存储单元组成,能提供的有效字数有限,存在舍入误差。
一个单精度实型变量只能保证7位有效数字,后面的数字是无意义的,并不精准地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则会“丢失”。
没有实现加11的运算,出现丢失。
自动类型转换
- 若参与运算的类型不同,则先转换成同一类型,然后进行运算。
- 转换按数据长度增加的方向进行,以保证精度不降低。
- 所有浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再运算。
- char型和short型参与运算时,必须先转换成int型。
- 在赋值运算中,赋值符号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。
强制类型转换
书写形式:
(类型说明符)(表达式)
注意:
表达式应该要用括号括起来
进行强制类型换时,得到的是一个所需类型的中间变量,原来变量的类型并未发生改变
运算符分类表
名称 | 运算符 |
---|---|
算数运算符 | + - * / % |
关系运算符 | > >= == != < <= |
位运算符 | >> << ~ & l ^ |
逻辑运算符 | ! ll && |
条件运算符 | (? : :) |
指针运算符 | & * |
赋值运算符 | = |
逗号运算符 | , |
字节运算符 | sizeof |
强制运算符 | (类型名)(表达式) |
各类运算符优先级比较:单目运算符>算术运算符> 关系运算符 >逻辑运算符(不包括!)>条件运算符>赋值运算符>逗号运算符
基本算法运算符
- 加法(+) 减法(-)乘法(*)运算符
- 除法运算符(/):两个整数相除结果为整数,舍去小数,只取商
- 求模运算符(%):要求 求余运算符两侧均为整数
自加自减运算符
- 前置运算------运算符放在变量之前:++A ++a先使变量的值增(或减)1,然后再以变化后的值参与其他运算,即先增减,后运算。
- 后置运算------A++ a++ 即先运算,后加减。
注意:
++和 - - 只能用于变量,而不能用于常量或表达式。
++和- -结合方向是“自左向右”
复杂的运算式中的组合原则是尽可能多的自左向右将若干字符组成一个运算符
++和- - 在循环语句中,使循环控制变量加(减)1,在指针变量中上移(下移)一个位置。
算术表达式
区别:(与数学书写形式)
- c语言的算术运算式的乘号(*)不能省略。
- c语言的算术运算式不许有分子分母形式。(a+b)/(c+d)不等于a+b/c+d
- c语言的算术运算符只能用圆括号改变运算优先级,多层括号时括号必须左右配对,运算时由内括号到外括号依次计算。
- c语言表达式只能出现字符集允许的字符。
注意:c语言规定了进行表达式求值过程中,各运算符的“优先级”和“结合性”
赋值运算符
例:x=7;将赋值运算符右边的表达式的值赋给其左边的变量
注意:赋值号“=”的左边只能是变量
复合赋值运算符
例:x+=7;在赋值符“=”之前加上其他二目运算符(x=x+7)
形式: 变量 复合运算符 表达式
赋值表达式
例:x=7 由赋值运算符组成的表达式称为赋值表达式。
形式:变量=表达式
逗号表达式
形式:表达式1,表达式2,表达式3…表达式n
说明:(运算结果)
逗号表达式的求解过程为先求解表达式1,表达式2,以此类推,结合性为自左向右。
表达式n的值即为整个逗号表达式的值。
逗号运算符的优先级是所有运算符中最低的。
第三章 算法与流程图
算法
现实生活中解决问题时,一般都要制定一个针对具体问题的步骤和方法,以此为据去实现目标。将为了解决问题所制订的步骤、方法称为算法。
算法的特征
有穷性 、确定性、有效性、有零或多个输入、有一个或多个输出
常用流程符号
流程图表达法
- 表示相应操作的框
- 带箭头的流程线
- 框内外必要的文字说明
顺序结构流程图
选择结构流程图
循环结构流程图
第四章 顺序结构程序设计
scanf函数
- 函数格式:scanf(格式控制字符串,变量地址列表)
- 函数功能:通过标准输入设备(键盘、写字板等),按照格式控制字符串中的格式要求为变量地址列表中的变量输入数据。
- 格式控制字符串:格式控制字符串是用双引号括起来的字符串,包括格式转换说明符,没有转义字符和普通字符。
格式转换说明符 | 功能描述 |
---|---|
%d | 输入一个十进制整数 |
%f | 输入一个单精度实数 |
%lf | 输入一个双精度实数 |
%c | 输入一个字符 |
%s | 输入一个字符串 |
%o | 输入一个八进制整数 |
%x | 输入一个十六进制整数 |
%* | 表示本输入项只是读入,但不赋给相应变量 |
注意:
格式控制字符串中多个格式转换说明符之间没有逗号,输入数据时,通常使用空格键或者回车键来分隔数据;格式转换说明符之间有逗号,输入数据时,一定要用逗号来分隔数据。
格式转换说明符个数和类型必须与变量地址列表一一对应。
*(抑制字符)表示本输入项只是读入,但不赋给相应变量。
prinf函数
- 函数格式:printf(格式控制字符,输出列表)
- 函数功能:将输出列表中的各个表达式的值安按照格式控制字符串中对应的格式输出到标准输出设备显示屏入。
- 格式控制字符串
格式转换说明符 | 功能描述 |
---|---|
%d | 输出一个十进制整数 |
%f | 输出一个单精度实数 |
%lf | 输出一个双精度实数 |
%c | 输出一个字符 |
%s | 输出一个字符串 |
%o | 输出一个八进制整数 |
%x | 输出一个十六进制整数 |
%e 或%E | 按指数格式输出一个实数 |
- 输出列表:输出列表由输出项组成,两个输出项之间用逗号分隔,输出项可以是一般的表达式,也可以是简单的变量,即:变量名或表达式。
注意:
格式转换说明符个数和类型必须与输出列表一一对应。
格式控制字符串中可以有转义字符和普通字符。转义字符根据具体作用实现操作,普通字符原样输出。
修饰符m(正整数):指定输出项所占的宽度,当指定宽度小于实际宽度时按实际宽度输出,当指定宽度大于实际宽度时在前面用空格补足。
修饰符.n(正整数):指定输出的实型数据的小数位数(四舍五入),系统默认小数位数为6.
修饰符0(数字):指定数字前的空格用 0 填补。
修饰符–:指定输出项的对齐方式,表示左对齐 。
getchar函数
- 函数形式:getchar ();
- 函数功能:getchar()函数的功能是从标准输入设备输入一个字符。
说明:
该函数没有参数,函数的返回值是从输入设备得到的字符。
从键盘上输入数据通过回车键结束,送入缓冲区,该函数从缓冲区中读入一个字符赋给字符变量。
该函数也可以接收回车符。
注: ch2 字符接收的是回车。
putchar函数
- 函数格式:putchar(ch);
- 函数功能:putchar ()函数的功能是向标准输出设备输出一个字符。
说明:
输出字符型变量
输出字符或者整型常量
输出转义字符
第五章 选择结构程序设计
关系运算符
- 前4种优先级相同,后2种优先级相同,前4种优先级高于后2种。
- 关系运算符的优先级低于算术运算符。
- 关系运算符的优先级高于赋值运算符。
关系表达式
关系表达式的值有两个分别为1和0,当关系表达式成立时,其值为1,当关系表达式不成立时,其值为0,c语言中以1表示为“真”,以0表示“假”。
逻辑运算符
&&(逻辑与)||(逻辑或)!(逻辑非),“&&”和“||”是是双目运算符,要求有两个运算量,且结合方向为左结合。“ !”为单目运算符,要求有一个运算量,且结合方向为右结合。
优先级表
逻辑运算符真值表
A | B | A&&B | AIIB | !A |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 非0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 |
非0 | 非0 | 1 | 1 | 0 |
逻辑标识符
- 逻辑与表达式计算过程:对于与表达式A&&B,先计算A的值,当A的值为0时,不再计算B(此时说明与表达式的值一定为0);当A为非0时,再计算B。
- 逻辑或表达式计算过程:对于或表达式AIIB,先计算A,当A的值为非0时,不再计算B(此时说明或表达式的值一定为1);当A的值为0时,再计算B .
- 逻辑非表达式计算过程:对于非表达式!A,先计算,然后取反。
单分支结构:if语句
双分支结构:if…else…语句
多分支结构:if…else if语句
多分支结构:if…else 嵌套
多分支结构:switch语句
第六章 循环结构程序设计
while语句
- while 语句表达式:
while(表达式)
{
循环体;
} - 执行描述
(1) 计算while后面的表达式值,如果值为真,则执行步骤(2);否则跳出循环体,继续执行该结构后面的语句。
(2)执行循环语句
(3) 重复执行步骤(1) - 说明:
(1)循环的结束由while后面的表达式控制,循环体中必须有改变循环控制变量值的语句,使循环倾向于结束,否则出现死循环,无法结束。
(2)循环体如果有一条以上的语句,应该用大括号括起来,如果只有一条语句,大括号可以省略。
do while语句 - do while 的格式
do
{
循环体
} while(表达式); - 执行描述
(1)执行循环语句
(2)计算while后面的表达式值,如果值为真,则重复执行步骤(1),否则跳出循环体,继续执行该结构后面的语句。
注意 :while语句是先判断条件后执行循环体,而do while语句是先执行循环体后判断。
for 循环结构 - for 语句的形式**
for(初始值;条件;增量)
{
循环体;
} - 执行描述
(1)计算初始值(只执行一次)
(2)判断条件,如果值为真,则执行步骤(3),否则跳出循环体,继续执行该结构后面的语句。
(3)执行循环体语句
(4)计算增量
(5)重复执行步骤(2)
说明: - 循环体如果有一条以上的语句,应该用大括号括起来,如果只有一个语句,大括号可以省略。
- for语句中的表达式可以省略任意一个,也可以都省略,但“;”不可以省略。
break语句 - 格式: break;
- 功能:使程序运行时中途退出switch结构或者一个循环体。
- 说明:
(1)break语句不能用在除了switch语句和循环语句以外的任何其他语句。
(2)在嵌套循环结构中,break语句只能退出包含break语句的那层循环体。
continue语句 - 格式: continue;
- 功能: 提前结束本次循环,跳过continue语句下面未执行的语句,继续进行下一次循环。
- 说明:
(1)continue语句通常和if语句连用,只能提前结束本次循环,不能使整个循环终止。
(2)continue语句只对循环起作用。
(3)continue语句在for语句中结束本次循环,但for语句中的增量仍然执行。
循环嵌套
说明: - while语句和for语句可以相互嵌套。
- 外层循环执行一次,内层循环执行一轮(即执行完自己的循环)。
- 内层循环控制可以直接引用外层循环的相关变量,但不要轻易改变外层循环控制变量的值。
第七章 数组
一个数组用来存放多个相同类型数据组成的一个集合。
格式:数据类型说明符 数组名[长度]
说明:
(1)数组名的命名规则必须遵循标识符的命名规则。
(2)长度表示数组中元素个数,必须是整数,常用整型常量或整型常量表达式来表示。
(3)长度必须用方括号括起来。
(4)数组必须占据一片连续的存储单元,所占总字节数为单个元素所占字节数乘以数组长度。数组中的元素用数组名和下标相结合来区分,下标是从零开始。
(5)单独使用数组名不能表示数组的某一个元素或所有元素。数组名等价于数组的首地址,也就是数组中第一个元素的地址。
注意:如果只对数组中部分元素初始化,则数组的长度不能省略不写,其他没有赋值的元素的初始值为零或者为零.零。
冒泡排序法
第一轮:找出5个数中的最大值,将最大值放在a[4]中,则其他4个数分别放在a[0]、a[1]、a[2]、a[3]中。
第二轮:找出4个数中的最大值,将最大值放在a[3]中,则其他3个数分别放在a[0]、a[1]、a[2]中。
第三轮:找出3个数中的最大值,将最大值放在a[2]中,则其他2个数分别放在a[0]、a[1]中。
第四轮:找出2个数中的最大值,将最大值放在a[1]中,则其他1个数分别放在a[0]中,为最小值。
字符数组
定义:字符数组的定义与一维数组的定义格式相似,其数组元素的数据类型为字符型变量,关键字为char。
注意:其他没有赋值元素的初始值为‘\0’。
字符数组元素的引用格式:字符数组名[下标]
例:
char ch[12]={
'C','O','O','d,'m','o','r','n','i','n','g'};
注:
- 下标为整数,从0开始,最大值为长度为-1,下标要用方括号括起来。
- 字符数组的长度至少要比字符串的长度多一个字节,这是因为字符串的结束标志‘\0’也要存放在该字符数组中,字符‘\0’为空字符(不是空白字符),其ASCLL码值为0。
例:
char st[11]={
"a good man"};
char st[11]="a good man";
注:等价 需要一个字符来存放字符串结束标志‘\0’,字符串必须用双引号括起来,外面可以有花括号,也可以省略花括号。
例:
char a[]=''student'';
char a[]={
's','t','u','d','e','n','t'};
注:不等价 字符数组a的长度为8,包含一个字符串“student”和字符串结束标志符‘\0’;字符数组b的长度为7,没有字符’\0’。
字符串处理函数
字符串输出函数puts(): 在显示器上显示一个字符串(存储单元中以’\0’结束的字符序列)一般形式:puts(字符数组名);
字符串输入函数gets(): 从键盘上接收一个字符串,存放在字符数组中,最后在字符串末尾自动加上结束标志’\0’ 一般形式:gets(字符数组名);
注:
输入字符串的个数不能超过字符数组的长度(数组中必须至少留下一个字符存放’\0’),否则,C语言程序不会自动停止读取字符,这样会出现不可预料的结果。
gets() 与scanf()区别
scanf("%s",a)接收字符串时,是将从第一个非空白符开始,到下一个空白字符结束前的这些字符存放在数组中,末尾自动加上结束标志’\0’。而gets()接收字符串时,空白字符当作普通字符接收。
字符串连接函数strcat(): 字符串连接函数strcat()来自头文件string.h该函数的作用是把字符数组2中的字符串连接到字符数组1中字符串后面,但字符数组1后的字符串结束标志被字符数组2的第一个字符覆盖了,在新字符串末尾自动加上结束标志’\0’. 一般性形式:stract(字符数组1名,字符数组2名);
注意:连接后的新字符串存放在数组1中,新字符串的长度不能超过字符数组1的长度。
字符串复制函数strcpy(): 字符串复制函数strcpy()来自头文件string.h该函数的作用是把字符数组2中的字符串复制到字符数组1中,末尾自动加上结束标志’\0’ 一般形式:strcpy(字符数组1名,字符数组2名);
**字符串比较数组strcmp()**字符串比较函数strcmp()来自头文件string.h,该函数的作用按ASCLL码依次比较两个数组中的字符串,并有一个返回值。 一般形式:strcmp(字符数组1名,字符数组2名);
- 字符串1=字符串2,返回值为0
- 字符串1>字符串2,返回值为>0
- 字符串1<字符串2,返回值为<0
**字符串实际字符个数函数strlen():**字符串实际字符个数函数strlen()来自头文件string.h,该函数的作用是求字符数组中字符串的字符个数(不包括字符串结束标志’\0’ )并返回该值。 一般形式strlen(字符数组名);
注:字符数组中字符串实际字符个数与字符数组的长度为两个不同的概念。
字符串中大写字符转小写字符函数strlwr(): 字符串中大写字母转换小写字母strlwr()来自头文件string.h,该函数的作用是将字符数组中的字符串的大写字母转换成小写字母,其他字符不发生变化。 一般形式为strlwr(字符数组名);
字符串中小写字母转换大写字符函数strupr(): 字符串中小写字母转换为大写字母strupr()来自头文件string.h,该函数的作用的将字符数组中的字符串的小写字母转化为大写字母,其他字符不变化。 一般形式strupr(字符数组名);
字符数组实例
从键盘上输入一串字符,将字符串里的小写字母变成大写字母,其他字符不变并全部显示出来。(不使用库函数中的strupr()函数)–小写字母的ASSCLL码比大写字母的ASCLL码大32.
二维数组
一般形式:数据类型说明符 数组名[常量表达式1][常量表达式2];
- 二维数组中每个元素都有2个下标,都必须分别放在单独的方括号内。
- 二维数组定义中常量表达式1表示该数组具有的行数,常量表达式2表示该数组具有的列数;两个数字的乘积是该数组的元素的个数。
- 二维数组的存放规律是按行存储的。
二维数组的初始化
- 按行给二维数组所有元素初始化
- 按存储顺序给二维数组所有元素初始化
- 给二维数组所有元素赋初值时,二维数组第1维长度可以省略(编译程序可以计算出长度),但是第2维长度在任何时候都不可省略。
- 对部分元素赋初值
例:打印出以下的杨辉三角形(要求打出10行)
第八章 函数
库函数
由c语言提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可,在程序中直接调用。如:printf、scanf、getchar、putchar、gets、puts、等函数均属于此类,都需要加上头文件#include"stdio.h"
说明:一定要加上头文件#include"math.h",math.h是数组头文件,sqrt函数是其中之一,其功能是开方。
自定义函数
自定义函数 是由用户按需求自己编写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且要在主调用函数模块中还必须对该被调用函数进行类型说明,然后才能使用。
函数定义
- 无返回值无参数定义形式
void 函数名()
{
函数体;
}
其中void和函数名称为函数头。函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可省略。{}中的内容称为函数体。在很多情况下函数都不要求有返回值和参数,此时函数类型符可以写为void,void代表函数无类型,无返回值。 - 无返回值有参数定义形式
void 函数名(形式参数表列)
{
函数体;
}
有参函数比无参函数多了一个内容,即形式参数表列。在形参表列中给出的参数称为形式参数,它们可以是各个类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表列中给出形参的类型说明。 - 有返回值无参数定义形式
类型标识符 函数名()
{
函数体;
return 表达式;
}
类型标识符指明了本函数的类型,函数的类型实际上的函数返回值的类型。return语句的作用是把值作为函数的值返回给主调函数。有返回值的函数中至少应有一个return。 - 有返回值的定义形式
类型标识符 函数名(形式参数表列)
{
函数体;
return 表达式;
}
注: - 在c语言程序中一个函数的定义可以放在任意位置,既可以放在主函数main之前,也可以放在main之后。
- 函数说明与函数定义中的函数头部分相同,但末尾要加分号。
转载:https://blog.csdn.net/weixin_43760254/article/details/88172767