0%

C语言复习(一)之 基础知识汇总

有许多学科,明明是理科,但需要记忆的内容却不少。这样的学科往往令人头疼。
而C语言这类的编程语言正是这样。不过相较于物理学习的物理学史,编程语言的需要记忆的内容多为基础知识。也就是说,这些需要记忆的东西正是为后面的深入学习做准备。因此C语言中的基础知识是非常有必要记忆和理解的。

编程/计算机通识

一般通识就是考教材上的内容

算法的概念

计算机科学家 Wirth 提出著名公式“数据结构+算法=程序”
是提前设计好的通过有限步得出结果的一种解决问题的方式(算法是解题方法的精确描述)
## 算法的特点 (1)有穷性:步骤应有限,否则不会输出结果
(2)确定性:算法的每一个步骤应是确定的
(3)有多个或零个输入(重要)
(4)有一个或多个输出(重要)
(5)有效性:每个步骤都能被有效执行 ## 算法的描述

一、自然语言

通俗易懂,适合求解简单的问题

1
2
3
4
5
6
7
8
题目:设有两个整数 A 和 B,要求将它们互换
第一步:定义一个新的变量 C,将 A 的值赋给 C;
第二步:把 B 的值赋给 A;
第三步:把 C 的值赋给 B;
以上程序可以简写为
S1: C <-- A;
S2: A <-- B;
S3: B <-- C.

二、流程图

直观、易懂
流程图 ### 三、计算机语言 机器语言
汇编语言
高级语言(C语言属于这个,其他两类语言做了解即可)

进制转换

日常生活使用 十进制(d/D), 计算机内部使用 二进制(b/B), 人类管理计算机内部的二进制时使用 十六进制(h/H) 。因此这三种进制是所有进制里最重要的,相互转化是一定要掌握的。

注:C语言只有八、十、十六进制,没有二进制,但是所有进制都要转换为二进制处理。 ### 十进制转二进制(转 k 进制) 考试的重难点,属于没学过就非常花时间的那种题。(小学现在都开始学二进制的四则运算了,作为大学牲还不会十转二,这合理吗)
#### 基本方法:倒取余数法(短除法)
倒取余数法 这幅图非常直观,效率也非常高,求解过程中没有思维上的障碍,只要想通为什么能够用这样的方法来计算二进制,就不会忘记这种方法了。转 k 进制只需将除数‘2’换成‘k’就可以了。这同时也是编程中常用的方法。
#### 进阶方法:背表(非正式名称)
例如:将十进制 29 转化而二进制
1. 十进制29介于16与32之间,而我们知道16的二进制是10000,32的二进制是100000,所以结果有五位,第一位是 2. 29减去16后,继续求剩下的四位。13介于8和16之间,所以介于1000和10000之间,推断出第二位是1
3. 剩下的5其实是常用的,可以直接看成101了
4. 得出结果 29d = 11101b
这种方法熟练后比倒取余数法快,本质上是一种迭代或递归的处理思想,将大问题转化为小问题。
有些场景下会计算的很快,例如 127d = 1111111b 这是因为 128d = 10000000b,所以给128的二进制数减去1就能快速得到127的二进制数。
同理其实29也可以快速计算:29 = 31 - 2; 29d = 11111b - 10b = 11101b;
合理的综合使用方法能够显著地提升计算的速度。
### 二进制(k 进制)转十进制 相比之下,二进制转十进制就容易很多。
十进制数 123 本质上也和其他进制一样 1×10^2 + 2×10^1 + 3×10^0 = 123d
在进制中 像例子中的1 2 3称为基数, 10^2 10^1 10^0 称为位权
同理,二进制转十进制的计算方法是一样的
例如 11101b = 1×2^4 + 1×2^3 + 1×2^2 + 0×2^1 + 1×2^0 = 29d
k进制同理,不举例。

二进制 与 十六进制相互转化

这是一种特殊的进制转换,因为 16 是 2 的四次方,所以一位十六进制数可以用四位二进制数来完全表示。
#### 二转十六 例如 1110101b
1.补齐位数:将二进制数补成 4 的倍数位 01110101b
2.转化:0111 是 十六进制里的 7, 0101 是十六进制里的 5;
3.拼接:1110101b = 75h
再来一个例子 101110b
1.补齐位数:00101110b
2.转化:0010b = 2h , 1110b = Eh; ( E 是十六进制中的 14 )
3.拼接:101110b = 2Eh
#### 十六转二 例如 46 1. 转化(不足四位补齐):4h = 0100b; 6h = 0110b;
2. 拼接(开头的 0 去掉):46h = 1000110b

附上二进制对应十六进制表(不要求背) 十六进制


C语言基础

基础认识

程序结构有三种

顺序结构:从上往下执行,以分号为间隔,一句一句执行。
选择结构(分支结构):主要是以 if { } else { }语句实现,特殊情况可以使用Switch语句来简化代码
循环结构:以 for 循环和 while 循环来实现。

理论上,学会这三种程序结构,就可以设计一切的程序了。复杂的功能都是由这三种结构设计出来的,程序设计课程也是为了能熟练运用这三种结构来设计算法解决问题。

程序基本结构

下面是最基础的一段代码:

1
2
3
4
5
6
#include <stdio.h>

int main() {
printf("Hello, world! \n");
return 0;
}
下面我们从这段最基础的代码中分析一下 C 语言程序的基本框架:
#### 一·编译过程 先介绍一下代码所在的文件名,不妨叫做 demo.c 好了,其中 .c 是文件的后缀名,表示是 C 语言的源文件,若要运行 C 语言的程序,需要经过两个步骤:1.编译( .c --> .obj ) 2.链接( .obj --> .exe )这两步都成功后,程序才能正常运行。
同时,也只有 demo.exe 文件才可以运行,demo.c 和 demo.obj 都无法运行
#### 二·代码解释 #include <stdio.h>
第一行是编译预处理,名词看不懂没关系,可以理解成在编译这一过程中,将 stdio.h 这个文件里面的内容放在了这一行里面。

stdio: standard input output 标准输入输出
.h: header file 头文件的后缀名
在第四行使用的 printf 函数包含在头文件 stdio.h 中,因此要将这个头文件 include 进来。
include 这一行不用加分号!!!

int main() {...}
第三行开始的代码为需要执行的代码,也是运行时开始执行的代码(没错,是从第三行开始运行的,第一行是编译的过程中需要读取的内容)
C 语言的程序是从以函数 main() 为入口,主函数中的 return 0 为出口的(如果有return的话)。
printf("Hello, world! \n");
这一行是 printf 的语法,在此不做解释。

return 0;
这一行可以看成是语法要求的,用于结束主函数的运行,并且返回给编译器一个整数 0

标识符

标识符的命名规则

  1. 必须由字母、数字、下划线组成,不能有其他的符号。
  2. 并且第一个必须为字母下划线,不能以数字开头。
  3. 且不能使用关键字进行命名。

区分大小写,sum 和 Sum 是两个毫不相关的标识符。
### 标识符的分类 关键字:不可以作为用户标识符。例如 int double auto if while 等等,但是 While 可以作为用户标识符,因为大小写区分。
预定义标识符:C语言中系统预先定义的标识符,比如 printf define include 等等,这些都可以作为用户标识符
用户标识符:用户根据需要自己定义的标识符称为用户标识符。无论如何自定义标识符,都必须符合标识符的三条命名规则。

基本数据类型

数据类型

整型

这一块将按照数据类型的长度(即所占内存大小)来介绍整型数据类型

char (unsigned char): 字符常量(无符号char),8位,1字节
short (unsigned short): 短整型,16位,2字节
int (unsigned int): 整型,一般32位,4字节
long (unsigned long): 长整型,32位,4字节 (没错,int和long的存储空间是一样的)
long long (unsigned long long): 长长整型,64位,8字节

表示范围:-2^(位-1) ~ 2^(位-1)-1 (无符号 0 ~ 2^位-1)

浮点型

只有两个数据类型

float: 单精度浮点型,32位,4字节 double: 双精度浮点数,64位,8字节

字符类型

char: 在整型出现过,char储存方式为整型,但是一般字符用char来表示,后期的字符串也是用char来作为基本元素

常量

const: 在定义变量时, 如果决定不改变其值, 可在数据类型前加上const以达到目的。

如: const int x = 4; 这样就保证了 x 的值为 4 且不再改变。

指针类型

以后会涉及,位数与电脑位数相同,用 long long 存储,一般以十六进制表示。

空类型

void: 通常用于函数地返回值类型,写 void 的话就可以不用 return 语句

(2023.11.21 完)

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道