Loading... <div class="tip share">请注意,本文编写于 196 天前,最后修改于 159 天前,其中某些信息可能已经过时。</div> # 绪论 本章很多都是一些理论知识相关的,并且很多基础知识,所以笔记不会写很多。建议有一定语言基础的人看,可以过一遍,刷几遍题基本就可以了。所以很多我赶进度不会都记录下了,会缺少一部分内容。**(简单点说就是记录可能考的以及容易遗忘的,不会全部记录,实在没时间边学边记录,什么时候有空可能会补上)** ## C语言特点 1. 简洁、紧凑、使用方便、灵活。一共有32+5个关键词(如果考试就写32个,C99规范增加了5个) | auto | break | case | char | const | continue | default | do | | ------ | ------ | -------- | ------ | -------- | -------- | -------- | ------ | | double | else | enum | exterb | float | for | goto | if | | int | long | register | return | short | signed | static | sizeof | | struct | switch | typedef | union | unsigned | void | volatile | while | C99规范新增5个关键词: | inline | restrict | _Bool | _Complex | _Imaginary | | ------ | -------- | ----- | -------- | ---------- | 2. 9种控制语句,34种运算符 3. C语言严格区分大小写 4. 语法限制不太严格,程序设计自由度大 5. C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作 6. 生成目标代码质量高,程序执行效率高 7. 用C语言编写的程序可移植性好能(编写大规模、复杂的程序不是C语言的特点) ## C语言的提示 C语言,或者说大多数语言都有两种提示(错误和警告) * **错误:** 表示程序不正确,无法正常编译、链接和运行。必须要纠正。 * **警告:** 类似变量溢出、代码不规范等情况,会产生警告,表示可能会产生错误影响程序运行的结果,但是能正常运行。 ## 最简单的C程序 ```c #include<stdio.h> int main() { printf("hello world!"); return 0; } ``` * `#include<stdio.h>`是 `预处理指令`[^预处理指令]。在C语言编译之前,预先执行的指令。 * `.h`是头文件,封装了很多功能供我们使用,例如 `scanf()`函数 * stdio是标准输入输出的缩写 <div class="tip inlineBlock share"> #include<stdio.h>和#include "stdio.h" 的区别:头文件的搜索路径不同。<>在系统路径下查找头文件;""首先在当前目录下查找头文件,没找到再到系统路径下查找 </div> <div class="tip inlineBlock warning"> main()是主函数函数,在每个C语言程序有且仅有一个 </div> C程序执行过程的详解介绍: 1. 上机编写源程序,保存.c结尾的文件。 2. 预处理,编译前先执行预处理指令。比如先读取stdio.h文件。 3. 编译,对编辑好的C代码进行语法检查,检查通过会把源程序转化为二进制目标文件,以.obj结尾的文件。如果不特别指定,.obj文件和.c文件在同一目录下。 4. 链接,在windwos系统下.obj文件不能执行,所谓的链接相当于“打包”,把目标文件和函数库链接为一个整体,最后生成.exe文件、可执行程序 5. 程序出现问题,我们修改这些bug就是程序调试(debug) # 算法 ```mindmap - 算法 - 算法的概念 - 算法的特性 - 表现形式 ``` ## 算法的概念 ## 算法特性 ```mindmap - 算法 - 有穷性 - 确定性 - 有零个或多个输入 - 有一个或多个输出 - 有效性 ``` ### 有穷性 算法的步骤不可以是无限的 ### 确定性 每个步骤是确定的,不能是含糊不清的 ### 有零个或多个输入 有时不一定需要输入数据 ### 有一个或多个输出 没有输出的算法是没有意义的 ### 有效性 算法的每一个步骤要有效地执行,并得到正确的结果 # 数据类型 ```mindmap - 数据类型 - 基本类型 - 整型类型(整型) - 基本整型(int) - 短整型(short int) - 长整型(long int) - 字符型(char) - 双长整型(long long int) - 布尔型(bool) - 浮点类型(实型) - 单精度浮点类型(float) - 双精度浮点类型(double) - 枚举类型(enum) - 空类型(void) - 派生类型 - 指针类型(*) - 数组类型([]) - 结构体类型(struct) - 共用体类型(union) - 函数类型 ``` # 常量 ```mindmap - 常量 - 整型常量 - 八进制整型常量 - 十进制整型常量 - 十六进制整型常量 - 实型常量 - 字符型常量 - 字符串常量 - 符号常量 ``` ## 整型常量 ### 八进制整型常量 * 前缀为数字0,前缀之后的称之为数码部分,数码部分由0~7组成。 * 八进制通常是无符号数(不带有符号,没有负数的表现形式) ### 十进制整型常量 由0~9组成,无前缀。有符号 ### 十六进制整型常量 * 前缀为0x或0X,前缀后为数码部分 * 数码部分由0-9、A-F或a-f组成(a-f分别表示10-15) ### 整型常量后缀 长整型后缀为L或l,无符号数的后缀为U或u 例如:66L(十进制长整型)、88U(十进制无符号整型)、023L(八进制长整型)、0xAL(十六进制长整型)、63LU(十进制无符号长整型) <div class="tip inlineBlock share simple"> 520和520L在数值上没有区别,在早期计算机(16位)分配的字节存储空间不同(520分配2字节、520L分配4字节) </div> ## 实型常量 在C语言中,实型常量有两种,一种是 `十进制数形式`,另一种是 `指数形式`。 实型也称浮点型,所以实型常量称为实数或浮点型。C语言中谈到的实数与数学中的实数不同,数学中的实数指的是落在数轴上的数,包含有理数和无理数,但是在C语言中的实数只是指小数 ### 十进制数形式 由0-9和小数点构成。 * 3.14、0.0、-1.8等 * .2(0.2)、-.9(-0.9)、-.3(0.3)等 * -6.(-6.0)、-7.(-7.0)等 <div class="tip inlineBlock warning simple"> 顺口溜:点的一侧要有数,那么它就是小数 </div> ### 指数形式 一般形式为aEn,a是整数或者小数,n是整数,且E后面不可以为小数 * 3.14e2或3.14E2($ 3.14 \times 10^{2} $) * 6.28e-2或6.28E-2($ 6.28 \times 10^{-2} $) * .7e-2($ 0.7 \times 10^{-2} $) * -.2e+9($ 0.2 \times 10^{9} $) * 6e0($ 6 \times 10^{0} $) <div class="tip inlineBlock warning simple"> 顺口溜:e前e后要有数,e后必须是整数 </div> ## 字符常量 在C语言中,字符常量有两种,一种是普通字符,另一种是转义字符,C标准规定,每个字符占用空间大小是1个字节 ### 普通字符 用单引号括起来的一个字符。计算机内存单元只能存放 `二进制数`,无法存放字符,所以常见字符会匹配一个值(码),利用值(码)算出对应的二进制数,我们把值(码)成为 `ASCII码` **普通字符常量:** * '#' * 'A' * '1' 我们只需要记住6个ASCII(尤其'0','a','A'务必记住),如下: | 字符 | '\0' | '0' | 'a' | 'A' | ' '(空格) | '\n' | | :---------------: | :--: | :-: | :-: | :-: | :---------: | :--: | | ASCII码(十进制) | 0 | 48 | 97 | 65 | 32 | 10 | <div class="tip inlineBlock share simple"> ASCII小知识:0-31的ASCII码一般为控制码,不是用于打印输出的;32-126(共95个字符);48-57是字符 `'0'`-`'9'`;65-90是字符 `'A'`-`'Z'`,97-122是字符 `'a'`-`'z'`;剩下的是常见的标点符号,127是键盘删除命令 </div> ### 转义字符 是一种特殊的字符常量。以反斜杠开头,反斜杠之后跟一个或多个字符。转义字符不同于肉眼看见的含义,一般用来表示那些不便于表示的控制代码,一个转义字符占用一个字节的存储空间。 **常见的转义字符:** | 转义字符 | 含义 | 输出结果 | | :------: | :--------: | :--------------------------------: | | \' | 一个单引号 | 输出一个单引号 | | \" | 一个双引号 | 输出一个双引号 | | \\ | 一个反斜杠 | 输出一个反斜杠 | | \a | 警告 | 系统发出警告声 | | \b | 退格 | 将当前位置后退一个字符 | | \f | 换页 | 将当前位置移到下一页的开头 | | \n | 换行 | 将当前位置移到下一行的开头 | | \r | 回车 | 将当前位置移到本行的开头 | | \t | 水平制表符 | 将当前位置移到下一个tab位置 | | \v | 垂直制表符 | 将当前位置移到下一个垂直制表对齐点 | #### 八进制表示的字符 `'\数'`,`'\数数'`,`'\数数数'`(只有这三种写法)。其中“数”的取值范围为0-7,表示的是一个 `八进制的ASCII码`。 * `'\101'`理解为八进制,换算为十进制为65,是字符 `'A'`的ASCII值,所以 `'\101'`与 `'A'`等价 <div class="tip inlineBlock share simple"> `'\101'`属于字符类型,所以只开辟一个字节的存储空间,而 `01503`(整型的八进制)在32位机开辟4个字节空间,16为开辟2个字节空间,两者意义不同。 </div> #### 十六进制表示的字符 `'\x数'`,`'\x数数'`(一般情况只有这两种写法,部分编译器 `'\x数数数'`也可以正常编译)。其中“数”的取值范围在0-9,a-f或A-F,其表示的是一个 `十六进制的ASCII码` * `'\x41'`理解为十六进制,换算成十进制为65,是字符 `'A'`的ASCII值,所以 `'\x41'`与 `'A'`等价 ## 字符串常量 是由一对双引号括起的字符序列。 * “hello” * "3" * " qwl" **字符串常量和字符常量是不同的量。它们之间的主要区别:** 1. 字符常量由单引号括起来,字符串常量由双引号括起来 2. 字符常量只能是单个字符或转义字符,字符串常量则可以含一个或多个字符 3. 字符常量占一个字节的内存空间,字符串常量占的 `内存字节数等于字符串中字节数加1`。 例如:字符串"good"在内存中所占的字节为: | g | o | o | d | \0 | | :-: | :-: | :-: | :-: | :-: | <div class="tip inlineBlock share simple"> '\0'在字符串常量中内存中,表示为字符串结束的标志 </div> ## 符号常量 通过一个符号表示一个常量。 格式: ```c #define PI 3.1415 ``` 从定义处开始,遇到PI就表示为3.1415,通过 `#define`指令定义符号常量。不占内存 # 变量 ```mindmap - 变量 - 整型变量 - 变量的溢出 ``` 其值可以发生改变,且有一定的范围,不可以无限大或无限小。在内存中需要先开辟空间,方可使用(也就是变量要先定义,后使用) **代码实现:** ```c #include<stdio.h> int main() { int a = 10; // 定义变量 // 后继去使用变量a return 0; } ``` ## 整型变量 整型变量基本分为:基本整型和无符号整型。 ### 基本整型 关键字:int 一般考试是考4字节。 | 常见字节大小 | 范围 | | ------------ | ----------------------------- | | 2字节 | $ -2^{15} 到 2^{15} - 1 $ | | 4字节 | $ -2^{31} 到 2^{31} -1 $ | ### 无符号基本整型 关键字:unsigned int | 常见字节大小 | 范围 | | ------------ | ----------------------- | | 2字节 | $ 0 到 2^{16} - 1 $ | | 4字节 | $ 0 到 2^{32} -1 $ | ### 短整型 关键字:short int 或 short | 常见字节大小 | 范围 | | ------------ | ----------------------------- | | 2字节 | $ -2^{15} 到 2^{15} - 1 $ | ### 无符号短整型 关键字:unsigned short int 或 unsigned short | 常见字节大小 | 范围 | | ------------ | ---------------------- | | 2字节 | $ 0 到 2^{16} - 1 $ | ### 长整型 关键字:long int 或 long | 常见字节大小 | 范围 | | ------------ | ----------------------------- | | 4字节 | $ -2^{31} 到 2^{31} - 1 $ | ### 无符号长整型 关键字:unsigned long int 或 unsigned long | 常见字节大小 | 范围 | | ------------ | ----------------------- | | 4字节 | $ 0 到 2^{32} - 1 $ | ### 字符型变量 这里的字符是指 `char`类型,其实是开辟了四分之一int类型的字节大小(16位开辟二分之一int类型的字节大小)存储的ASCII码的二进制,所以本质还是整型,char仅开辟一个字节。 | char 开辟字节大小 | 范围 | | ----------------- | ----------------------------------------- | | 1字节 | $ -128 到 127 、 -2^{7} 到 2^{7} -1 $ | ```c int main() { char a = 'b'; printf("%c",a); return 0; } ``` ## 变量的溢出 char类型超出范围的话,就会产生溢出,改溢出是周期性的(char类型变量一共是256个数)。发生上溢(正溢)就是128。发生下溢(负溢)-666。 以-666为例,-666+256=-410(还是溢出,继续)、-410+256=-154(还是溢出,继续)、-154+256=102(没溢出,编译器输出的是这个值) # 进制转换 十进制就是我们日常生活中所使用的数字。 二进制、八进制、十六进制等需要经过转换成十进制才能变成我们日常所熟悉的正常数字 ## 二进制和十进制之间的转换 | 权值 | $ 2^7 $ | $ 2^6 $ | $ 2^5 $ | $ 2^4 $ | $ 2^3 $ | $ 2^2 $ | $ 2^1 $ | $ 2^0 $ | | :--------: | :-------: | :-------: | :--------------: | :--------------: | :-------------: | :-------: | :-------: | :-------: | | 值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | | 二进制位数 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | | 十进制值 | 0 | 0 | $ 32 \times 1$ | $ 16 \times 1$ | $ 8 \times 1$ | 0 | 0 | 0 | **按照该表可知:** 二进制 `00111000`的十进制数为$ 32 \times 1 + 16 \times 1 + 8 \times 1 = 56 $,同理十进制数按照表格的 `值`拆分逆推即可得到二进制 ## 八进制和十进制之间的转换 | 权值 | $ 8^3 $ | $ 8^2 $ | $ 8^1 $ | $ 8^0 $ | | :--------: | :-------: | :---------------: | :--------------: | :-------------: | | 值 | 512 | 64 | 8 | 1 | | 八进制位数 | 0 | 1 | 2 | 1 | | 十进制值 | 0 | $ 64 \times 1 $ | $ 8 \times 2 $ | $ 1 \times 1$ | **按照该表可知:** 八进制 `0121`的十进制数为$ 64 \times 1 + 8 \times 2 + 1 \times 1= 81 $,同理十进制数按照表格的 `值`拆分逆推即可得到八进制 ## 十六进制和十进制之间的转换 | 权值 | $ 16^3 $ | $ 16^2 $ | $ 16^1 $ | $ 16^0 $ | | :----------: | :--------: | :--------: | :---------------: | :--------------: | | 值 | 4096 | 256 | 16 | 1 | | 十六进制位数 | 0 | 0 | 1 | 3 | | 十进制值 | 0 | 0 | $ 16 \times 1 $ | $ 1 \times 3 $ | **按照该表可知:** 十六进制 `0x13`的十进制数为$ 16 \times 1 + 1 \times 3 = 19 $,同理十进制数按照表格的 `值`拆分逆推即可得到十六进制 [^预处理指令]: #开头的为预处理指令,并不是说 `#include<stdio.h>`是预处理指令。我们需要掌握 `#include`和 `#define` Last modification:November 25, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 1 如果觉得我的文章对你有用,请随意赞赏