C语言基础
一、C语言
1.程序
现实生活中的程序:执行某些事情的过程;
计算机中的程序:让计算机执行某些操作或解决某些问题所执行的一系列有序指令的集合;
(这一有序指令的集合必须符合某一种语言的语法,即符合某一种编译器的语法)
两者联系:计算机中的程序是模仿现实生活中的程序,以达到降低成本,提高效率的目的。
2.算法
2.1 概念
算法:描述解决一件事情的过程;
四个固性:
-
有穷性:步骤应该是有限的(算法要有结束的)。
反例:死循环
-
有效性:每个步骤应该是有效的。
利用现有技术和代码能够实现
-
确定性:每个步骤应该是清晰的,不可模棱两可。
-
交互性:算法具有输入和输出。
函数的参数和返回值
2.2 算法表示方式
- 自然语言(需求分析时使用)(需求分析规格说明书)
- 流程图(概要设计时使用)(概要设计规格说明书)
- 自然语言不同的理解时有歧义。例如:之前没钱买国产车,现在没钱买国产车。(之前是没有钱的人才买国产车,现在是没钱买得起国产车)
- 伪代码(详细设计时使用)(详细设计规格说明书)
- 伪代码不是真实的代码,而是一种使用一组标准的单词编写算法的方法,看起来与代码类似
- 因为用流程图循环时,可以用while、for语句,但while、for语句在编写时是由差别的(当型循环和直到型循环)
- 程序语言
2.3 流程图
- 流程图:是算法的一种图形化表示方式
- 分类
- 传统流程图
- 顺序结构
- 分支选择结构
- 循环结构
- 当型循环
- 直到型循环
- 当型循环
- 顺序结构
- N-S流程图
- 传统流程图
3.编程语言
3.1 编程语言分类
- 低级语言
- 低级语言是机器语言,本质是0,1代码
- 计算机只能识别正负电荷,人们用0代表负,1代表正
- 包括汇编语言(汇编语言其实质也是机器语言,只是把机器语言中常见的0,1代码用特定助记符特带了)
- 应用:可以直接编写操作系统,也可以直接操作计算机硬件
- 中级语言
- 本质是高级语言,但是可以直接操作计算机硬件,具备低级语言的功能
- 如:C语言等
- 高级语言
- 本质是人类语言(想让机器读懂,必须先经过编译转译成机器语言)
- 如:Java、Python、C++、Js等
- 应用:适用于写生活中的业务逻辑,大多数的高级语言都不能直接操作机器硬件
3.2 高级语言的编译和运行
-
编译
- 分类
- 一次编译(不能跨平台)
- 二次编译(可以跨平台),相当于先编译再解释
- 用处
- 查语法规则(任何代码文件本质是txt文件)
- 转译成0,1代码(机器语言)
- 分类
-
运行过程
高级语言程序 -----> 编译器、解释器 -----> 机器代码 -----> 计算机硬件
4. C语言简介
4.1 历史
一句话概括:C语言是1973年由贝尔实验室发明的一种面向过程的结构化的函数语言。开发初衷是替代汇编语言,用于开发系统级程序,即操作系统。
4.2 特点
- 结构化编程
- 顺序
- 分支
- 循环
- 模块化编程
- 函数
- 易于调试和运行
4.3 编译和执行方式
- 编辑:编辑源程序
- 源程序:是用户创建的文件,以“.C”为文件扩展名保存
- 编译:源程序编译后生成目标文件
- 目标文件:是编译器的输出结果。这类文件的常见扩展名为“.o”或“.obj”
- 连接:目标文件连接头文件后生成可执行文件
- 头文件:含有函数的声明和预处理语句,用于帮助访问外部定义的函数。头文件扩展名为“.h”
- 可执行文件:是连接器的输出结果。可执行文件的扩展名为“.exe”
- 执行:可执行文件执行后生成可执行程序
4.4 开发过程
- 分析问题,得到算法
- 编制程序
- 编译
- 连接
- 调试运行
- 完成
5. 编程思维
5.1 面向过程
- 解释:面向过程不是技术,是一中编程的思维方式。(C语言是面向过程的最优秀的技术)
- 面向过程强调做事的步骤,也叫面向算法、面向步骤
- 面向过程的语言是二代语言
5.2 面向对象
- 解释:面向对象不是技术,是当代主流的一种思维方式。(Java是面向对象的一种技术)(JS是基于对象)
- 面向对象强调做事情的主体,谁在做事
- 面向对象的语言是三代语言
6. 次小编程单元(数据类型)
-
什么是数据类型?
-
什么样的数据就用什么样的类型来存
-
约束内存空间的大小
-
数据类型代替运算法则
例如:10+10=20“10” + “10” = 1010
-
-
数据类型的分类
不同的平台上,数据的内存大小有差距,可以用
sizeof
查询数据内存大小- 数值型
- 整型:
int、short、long、unsigned(无符号整型)
- 非整型:
float、double
- 整型:
- 字符型
char
:字符数据存储的是其ASCII码存储在内存中- ‘a’ ~ ‘z’:97 ~ 122
- ‘A’ ~ ‘Z’:65 ~ 90
- ‘0’ ~ ‘9’:48 ~ 57
- 数值型
-
类型转换
与java一摸一样,但是java中一般用于引用数据类型的转换,同时对象类型的不能自动类型转换
-
自动类型转换
- 原则:把表示范围小的类型转换成表示范围大的类型的值
short -> int -> long -> float -> double
-
强制类型转换
- 原则:把表示范围大的类型转换成表示范围小的类型的值
- 语法:类型名 变量或数值
int a = 1; double b = 1.5; int c = (int)b + a;
- 强转类型转换可能出现的问题:丢失精度、乱码、一运行就死机
-
-
转义字符
转译序列 | 名称 | 描述 |
---|---|---|
\a | 警告 | 产生一则警告 |
\b | 退格 | 将光标回退一格 |
\f | 换页 | 将光标移到下一页的第一格 |
\n | 换行 | 将光标移到下一行的第一格 |
\r | 回车 | 将光标移到当前行的第一格 |
\t | 水平制表 | 将光标移到下一个水平制表位置 |
\v | 垂直制表 | 将光标移到下一个垂直制表位置 |
\’ | 单引号 | 产生一个单引号 |
\" | 双引号 | 产生一个双引号 |
\? | 问号 | 产生一个问号 |
\\ | 反斜线 | 产生一条反斜线 |
\o | 空 | 产生一个空字符 |
7. 最小编程单元(常量和变量)
7.1 常量
java只有一般常量,无符号常量。
-
什么是常量?
常量:在程序中值不能改变的量
-
常量分类
-
一般常量:不能变的常量
- 数值常量,如:10
- 字符常量,如:‘a’
- 字符串常量,如:“OK”
-
符号常量:用
#define
定义的量- 作用:可以在代码中做到一改全改
#define NUMBER 10
-
7.2 变量
除作用域外都与java一摸一样,但是C语言中的变量必须先声明在使用,且变量的声明语句必须在函数的开始处。
-
什么是变量?
- 在程序中,其值可以改变的量
- 变量的本质是一片连续的内存空间
- 变量是一个最小的、离散的、不带结构的容器,用来存放数据
-
变量的使用
变量必须先声明后使用
方式:
-
方式一:
声明语句:类型 变量名;
执行语句:变量名 = 初始值;int a; a = 10;
-
方式二
声明初始化语句:类型 变量名 = 初始化;
int a = 10
-
-
变量的命名规则
- 变量必须由数字、字母、下划线(_)组成,且字母、下划线开头
- 变量必须见名之意,且首字母小写
- 变量不能和关键字重名,且大小写敏感
-
变量作用域
- 全局作用域
- 局部作用域
8. Hello World!
代码只能有一个主方法(main方法),main也是主函数的开始。
#include<stdio.h>
void main() {printf("Hello World!\n");
}
- #:代表预编译指令
- include:代表包含函数
- <stdio.h>:代表引入的函数库(输入输出函数库)
- .h:代表头的意思,完整的是.header
- void main() {}:代表的是主方法
9. 输入输出
9.1 类型
- 输入输出字符串:
gets()
和puts()
- 输入输出字符:
getcha()
和putchar()
- 格式化输入输出:
scanf()
和printf()
scanf()
scanf = scan(输入) + formart(格式化)
- 标准的输入函数,按照格式化描述把读入的信息转换为指定数据类型的数据
- 特征:
scanf()
见到回车、换行,该scanf()
语句就结束
printf()
printf= print(输出) + formart(格式化)
- 标准的输出函数,按照用户规定的格式、用户规定的数据类型把信息打印控制台
- 对于输出整型数据,可使用"
%Nd
"的格式,以达到控制输出宽度和右对齐的效果 - 对于输出浮点型数据,可使用"
%M.Nf
"或"%M.Nlf
"的格式,以达到控制输出宽度输出精度和右对齐的效果
9.2 占位符
占位符 | 数据类型 | 描述 |
---|---|---|
%d | int | 十进制数 |
%ld | long | 十进制数 |
%f | float | 十进制数,可以有小数点及指数部分 |
%c | char | 字符型数据 |
%s | 字符串数据 | 字符串数据 |
10. 结构化
与java一摸一样
-
顺序结构
-
分支选择结构
- 单分支结构
- 简单单分支
if() {}
- 标准单分支
if() {} else {}
- 简单单分支
- 多分支结构
-
否定式:否定了第一个条件,才能进入下一个条件
switch能做的多重if都能做,但是多重if能做的,switch不一定能做,因为多重if可以处理连续的范围,但是switch只能处理离散得到的点。
- 多重
if
:相当于第一次成立的单选if () {} else if () {} else {}
switch
结构:
注意事项:switch() {case 1:111;break;case 2:222;break;default: 000;break; }
- 只能处理离散的点,不能处理连续的范围
case
的顺序可以调换,但是case
不可以重复break
可以不写,语法不会报错,但是逻辑有问题default
可以省略,相当于多重if
里面没有最后的else
switch
的参数必须是整型的,可以是常量、变量、表达式case
后面的数必须是整型常量
- 多重
-
肯定式(递进式):肯定了第一个条件,才能进入下一个条件,相当于第一次不成立的单选
if() {if() {if() {} else {}} else {} } else {}
-
- 单分支结构
-
循环结构
具体看
目录12 循环
11. 运算符
11.1 表达式
- 表达式 = 操作数 + 运算符
- 操作数:由常量、变量和子表达式组成
- 由什么样的运算符组成的表达式就叫什么表达式
11.2 分类
与java一样,但java返回值是ture和false
- 算数运算符
- 分类
-
一元运算符:由一个操作数组成,如:“
++
”、“--
” -
二元运算符:由两个操作数组成,如: “
+
”、“-
”、“*
”、“/
”、“%
”"/":当除号两边都是整型时,结果是整型的商; 当除号两边有一个实型或者两个都是实型,结果是精确的值;"%":两边必须是整型
-
- 运算符前缀:操作数在后面(先操作后使用),如:++a
- 运算符后缀:操作数在前面(先使用后操作),如:a++
- 分类
- 赋值运算符
-=
、+=
、-=
、*=
、/=
、%=
- 关系运算符(比较运算符)
<
、<=
、!=
、>
、>=
、==
- 返回值是
0,1
(0
代表假,1
代表真)
- 逻辑运算符
- 用于连接一个或多个条件,判断是否成立
- 分类:
- 与(
&&
):一假即假 - 或(
||
):一真即真 - 非(
!
):取反
- 与(
sizeof()
运算符- 获取数据类型在内存空间的大小(单位是字节)
- 在C语言中不同的平台上数据类型所占的内存空间大小不同
11.3 运算符优先级
- 从左到右依次降低:
()
-->!,++,--,sizeof
-->*,/,%
-->+,-
--><,<=,>,>=
-->==,!=
-->&&
-->||
-->=,+=,*=,/=,%=,-=