计算机基础
计算机的组成
计算机组成
-
计算机:能进行计算以及逻辑处理的设备
-
硬件:组成计算机的物理部件。(内存条、CPU、硬盘..)
-
软件:计算机中运行的程序和数据。
开发中对于硬件的认知:硬件包括电子设备、单片机、集成电路和嵌入式系统。
开发中对于软件的认知:软件分为系统软件(OS)、应用软件和编程工具(编译器)
计算机的六大部件
-
中央处理器(CPU):控制 + 计算
-
内存:临时存储运行时的数据。
-
输入设备:向计算机输入数据(键盘、鼠标、扫码枪)
-
输出设备:将计算机数据进行输出(显示器、打印机)
-
外存储器:永久存储数据(硬盘)
-
网络:数据传输与通信
计算机的工作原理
-
存储程序:程序和数据存储在内存中
-
程序控制:CPU按指令顺序执行
计算机的语法
-
机器语言:二进制代码,直接控制硬件
-
汇编语言:助记符形式,需要汇编器翻译
-
高级语言:C/C++,Java,Python,PHP,C#,GO
C语言简史与特点
C语言的起源
-
其前身是B语言;
-
B语言是美国贝尔实验室的 Ken Thompson(肯·汤普森)于1969年开发出来的,并且
-
用B语言编写了初版的UNIX系统
-
1972年美国贝尔实验室的Dennis Ritchie(丹尼斯·M·里奇)在B语言基础上开发的C语
-
言.C语言提供了丰富的数据类型和标识符,使得程序的编写变得非常高效和方便。
-
1973年初,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了UNIX。
C语言的标准
为了C语言健康发展下去,很多有识之士及美国国家标准协会(ANSI)于1982年成立了一个委员会以确定C语言的标准。
-
1989 ANSI 发布了第一个完整的C语言标准,即C89。不过人们习惯性的称为 “ANSI C”
-
1990年ISO(国际标准化组织一字不改的采纳了 C89,官方给出的名称为 ISO C90) 。
-
1999年,C语言标准经过了一次修正和完善后,ISO发布了新版的C语言标准,简称”C99”。
-
2018年6月份发布的 “C18”GNU C 标准 (标准C的扩展) ,进一步增强了语言的稳定性
-
和功能性。
-
在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。
-
“C23”是最新的标准,预计将进一步扩展C语言的功能和性能。
-
应用于Linux 系统,当然Linux也支持标准C,因为标准C是跨平台的。
嵌入式开发就是针对Linux系统的开发,而Linux系统是使用C语言开发的,所以从事嵌入式开发要使用C语言。
C语言特点
-
简洁高效,支持底层硬件操作
-
可移植性强,适合结构化编程
-
生成代码质量高,执行速度快
开发的三个步骤
① 编辑:编写源代码(.c
文件,程序员完成)
② 编译:将源代码文件转换为可执行的文件(编译器完成)
③ 运行:执行程序(操作系统加载)
C语言程序的编译过程
注意:本章节只是做一个简单的讲解,后续在深入!
上面提到的编译,实际上是分为了四个步骤:
-
预处理:处理宏和头文件以及注释等。
-
编译: 生成汇编代码
-
汇编:转换为机器码/二进制代码
-
链接:合并库文件和
目标文件(二进制代码)
测试代码:
// 头文件包含 预处理的时候,会将stdio.h中的代码全部拷贝到当前文件
#include <stdio.h>
// 宏定义
#define R 2
#define PI 3.14
int main()
{
printf("hello world!\n");
// 计算圆的面积
double area = PI * R * R; // 宏展开,double area = 3.14 * 2 * 2
printf("%f\n", area);
}
编译的命令
编译步骤 | 命令 | 文件类型 | 说明 |
---|---|---|---|
预处理 | gcc -E *.c -o *.i | *.c → *.i | 生成的是C代码(文本) |
编译 | gcc -S *.c -o *.s | *.i → *.s | 生成的是汇编代码(文本) |
汇编 | gcc -c *.c -o *.o | *.s → *.o | 生成的是二进制代码(文本) |
链接 | gcc *.c -o * | 生成的是二进制代码 |
C语言的基本结构
一个简单的C语言程序
功能:要求在控制台输出“hello world!”
代码:
/*********************************************************************
****
> File Name: demo01.c> Author: wu
> Description:
> Created Time: 2025年07月08日 星期二 10时34分35秒
**********************************************************************
**/
#include <stdio.h>
// 主函数:一个.c文件只能有一个main函数,这个函数是程序的入口
int main()
{
// 向控制台输出hello world!
printf("hello world!\n");
return 0;
}
程序结构分析:
-
注释:解释代码逻辑,写给程序员自己看,预处理阶段会被删除。
-
预处理指令:程序中包含的某一文件内容(
#include <stdio.h>
) -
主函数:
main
函数是程序唯一的入口,一个文件中最多有1个,这个函数不能被其他函数调用,这是一个自动执行的函数,系统是通过这个函数的指针进行访问的。 -
关于函数:
-
函数头:(函数首部或者函数说明)
-
说明函数类型,函数头由函数名和形参列表构成。
-
函数体:
包括变量说明和语句执行部分。
-
函数调用语句:比如:printf()
C语言编程规范要求
C语言在编程的时候,需要遵循如下规范:
-
常用的缩进格式(一般缩进2~4个字符,推荐缩进4个字符,我们Vim配置的是缩进4个字符,也就是一个 Tab键 )
-
要有足够的注释(添加必要的注释,使代码更好理解)
-
要有合适的空行(一般预处理指令和函数之间,函数和函数之间,全局变量和函数之间...,加空行提高代码可读性,使代码结构清晰)
/*****************************************************************
********
> File Name: demo02.c
> Author: wu
> Description:
> Created Time: 2025年07月08日 星期二 11时02分45秒******************************************************************
******/
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14
#define R 2
int fun()
{
printf("A\n");
}
int main(int argc,char *argv[])
{
printf("hello world!\n");
fun();
return 0;
}
-
{}
对齐(C和C++{
和}
都需要独占一行,千万不要受Java影响)
Java
int fun() {
...
}
C/C++
int fun()
{
...
}
-
函数体内采用分层缩进和模块化的书写方式
int fun()
{
if(..)
{
for(..)
{
printf("hello\n");
}
}
if(..)
{
for(..)
{
printf("hello\n");
}
}
}
-
不把多条语句写在程序的同一行上(最好的区分是,不要在同一行连续出现多个
;
,for循环(;;
)除外)
int main()
{
// 错误写法(不影响编译,但是影响阅读体验)
printf("hello");
printf("hello");
printf("hello");
// 错误写法(不影响编译,但是影响阅读体验)
int a = 10;
int b = 20;
// 正确写法
for (;;)
{
...
}
}
-
标识符命名要见名知意。
int main()
{
// 创建3个变量,用来存储年龄、身高、体重
// 错误演示(不影响编译,但是影响阅读体验)
int a = 21;
int b = 168;
int c = 190;
// 正确演示
int age = 21;
int height = 168;
int weight = 190;
}
C语言程序的设计特点
-
C语言程序在设计的时候,需要注意以下细节:
-
C程序有一个或多个函数组成,但有且仅有一个main函数;这个函数是程序的入口函数,可以置于任意位置,建议放在所有函数的最下面。
-
程序中可以有预处理指令(
#include、#define
),预处理指令通常放在程序的最前面。 -
每个语句以分号结尾:(注意:
预处理
,函数头
,函数
、分支语句
、while和for语句
后面不能添加分号,否则会报错) -
函数体由一对
{}
括起来,函数的{}
不能省略。 -
包含在
/*..*/
内,或者//..
后面的文本为注释内容,在预处理阶段删除。 -
一行可以写多个语句,一个语句可以写在多行上。
int main()
{
// 一行可以写多个语句
int a, b, c;
// 一个语句写在多行上
while(1)
{
...
}
}
// 格式化笔记中的代码:shift + tab
C语言中的注释
在C语言中,注释一般分为两类:单行注释和多行注释
注释的作用:给代码添加解释说明性文字,提升代码的可读性,注释本身不参与编译,在预处理阶段会被删除。我们同时也可以使用注释屏蔽掉暂时不需要的代码。
单行注释
说明:单行注释使用双斜杠//..
表示。我们一般用于变量、常量、函数调用语句等。
语法:
// 需要注释的内容
范例:
// 预处理指令,引入系统的标准输入输出库
#include <stdio.h>
int main()
{
// 向控制台打印输出 hello world!
printf("hell world!\n");
return 0;
}
多行注释
说明:多行注释使用双斜杠星花/*..*/
表示。它可以占用一行,也可以占用多行,但不能嵌套。我们一般用于函数,文件头说明等。
语法:
/* 要注释的内容 */
/*
要注释
的内容
*/
范例:
/*
主函数
*/
int main()
{
...
}
注意:由多行注释衍生出一种更为细致的注释,我们称之为文档注释
范例:
/**
* 主函数
* @author 开发者
* @param 参数1 说明
* @param 参数2 说明
* @return 返回值
*/
int main()
{
...
}
数据类型
定义
数据类型其实就是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。简单来说,就是组织和操作数据。
数据:计算机需要处理的数据(数字、字符串、文字、符号、图片、音视频等)
-
数据类型不仅帮助我们组织和操作数据,好决定了程序如何有效的利用内存。
-
了解数据类型的内存需求是理解计算机管理和操作数据的关键。
tips:程序运行需要在内存中
数据类型分类和计算方法
数据类型分类(重点)
-
基本类型(C语音内置)
-
数值类型
-
整型(整数)
-
短整型:
short
(short int缩写) -
基本型:
int
(使用频率最高) -
长整型:
long
(long int缩写) -
长长整型:
long long
(long long int缩写,C99新增)
-
-
浮点型(小数、实数、实型)
-
单精度浮点型:
float
-
双精度浮点型:
double
-
长双精度型:
long double
(C99新增)
-
-
-
字符型:
char
-
-
构造类型(C语音提供语法,用户自定义)
-
结构体:
struct
-
联合体/共用体:
union
-
枚举类型:
enum
-
-
指针类型
-
空类型:
void
(C语音内置)
数据类型在内存中的大小(重点)
序号 | 数据类型 | 中文说明 | 大小(字节) |
---|---|---|---|
1 | short(short int) | 短整型 | 2 |
2 | int | 基本整型 | 4 |
3 | long(long int) | 长整型 | 4(32位系统)/8(64位系统) |
4 | long long(long long int) | 长长整型 | 8 |
5 | float | 单精度浮点型 | 4 |
6 | double | 双精度浮点型 | 8 |
7 | char | 字符型 | 1 |
8 | bool(Bool,C99新增) | 布尔型,true-真,false-假 | bool:1 , true(1):4,flase(0):4 |
C/C++ 数据类型范围
数据类型 取值范围(十进制) char
-128 至 127 unsigned char
0 至 255 short
-32,768 至 32,767 unsigned short
0 至 65,535 int
-2,147,483,648 至 2,147,483,647 unsigned int
0 至 4,294,967,295 long
-2,147,483,648 至 2,147,483,647(32 位系统) unsigned long
0 至 4,294,967,295(32 位系统) long long
-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 unsigned long long
0 至 18,446,744,073,709,551,615 float
约 ±1.18×10⁻³⁸ 至 ±3.40×10³⁸(精度为 6-7 位有效数字) double
约 ±2.23×10⁻³⁰⁸ 至 ±1.80×10³⁰⁸(精度为 15-16 位有效数字)
小贴士:
获取某个数据类型或者变量所占的字节数,使用sizeof运算符:
sizeof(某个数据类型或者变量名)
printf("true size:%d\n", sizeof(true)); // trus size:4 解释:true本身就是int类型的1,所以占4个字节 printf("bool size:%d\n", sizeof(bool)); // bool size:1 解释:占1个字
案例:
/*********************************************************************
****
> File Name: demo03.c
> Author: wu
> Description:
> Created Time: 2025年07月08日 星期二 15时14分13秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
// 计算数据类型或者变量的字节大小,通过sizeof运算符
printf("long long 的大小是%d个字节\n", sizeof(long long)); // %d 表
示10进制整数
printf("long 的大小是%d个字节\n",sizeof(long));
printf("long double的大小是%d个字节\n",sizeof(long double));
return 0;
}
运行结果:
总结:
① 数据类型在内存中所占的字节数跟C语言的编译系统有关。
② 计算某个数据类型所占字节数可以用sizeof运算符。
③ 布尔类型要添加 #include <stdbool.h> ,大家也可以直接使用int类型的0和1来表示布尔类型。
常量
在C语音中,数据的基本表现形式是常量和变量。不管是变量还是常量,都是需要在neicun中申请一块空间,用于数据的存放
定义:在程序执行过程中其值不可改变的量,称之为常量
分类:int、float、double、char、符号常量(宏定义)
整型常量
-
整型常量可以用十进制、八进制、十六进制三种形式表示
-
十进制常量:由数字0~9构成,没有前缀,不能以0位开头。举例:
-
99,218 //正确
0 //正确
09 //错误,不能以0开头
-
八进制常量:由数字0~7构成,以0为前缀,不能表示小数。举例:
023,077 //正确
00 //正确
099 //错误
-
十六进制常量:由数字0 ~ 9、字母a ~ f/A ~ F构成,以0x/0X为前缀,不能表示小数。举例:
0xffffff //正确
0x55 //正确
0x0 //正确
注意:
整型常量中的长整型数据可用L或者1
作为后缀,举例:
long num = 123L
整型常量的分类
-
有符号与无符号基本整型常量(int)
-
有符号表示范围:负数+0+正数,默认写的都是有符号
-
无符号表示范围:0+正数,内存中所有负数的位置都用了表示整数,此时它的正数范围超过有符号正数范围
-
-
有符号与无符号长整型常量(long)
-
有符号与无符号短整型常量(short)
-
整型常量的表示:
-
十进制常量:由数字0~9以及+ -构成,没有前缀,不能以0位开头
-
八进制常量:由数字0~7以及+ -构成,以0为前缀,不能表示小数
-
十六进制常量:由数字0 ~ 9、字母a ~ f/A ~ F构成,以0x/0X为前缀,不能表示小数。
-
浮点型常量
C语音中浮点数就是平常说的小数(实数),有两种表现形式
-
十进制小数:如:0.123,-12.1,1.123F(float类型的常量,需要跟上f/F)
-
指数形式(科学计数法):
-
正数表示:如十进制小数1234.5de指数表示就是1.2345*10^3,也可以表示为{1.2345e3}
-
负数表示:如十进制小数0.012指数表示就是1.2*10^{-2},也可以表示为1.2e-2
-
注意:
-
在符号e的签名必须要有数字
-
在符号e的后面必须为整数,不能是带有小数点的实数型
-
实型常量的后缀用F/f表示单精度型
字符型常量
用``
括起来的一个字符,如'a'
' A'
'4'
'_'
等,比如 '刘'
就不是字符,一个汉字所占的字节数据超过1个字符。中文符号当成汉字理解。英文输入法下输入的字母,数字,符号都是单字符
转义字符常量:以反斜杠\
开头的字符序列,表示控制以及不可见字符。如:
字符形式 | 中文含义 | ASCⅡ码 |
---|---|---|
\n | 换行 | 10 |
\r | 回车 | 13 |
\0 | 空字符 | 0 |
\t | 水平制表符 | 9 |
注意:
printf("%s","hello world!\n"); printf("hello world!\n"); // 等价于上面写法
使用
man ascii
可以查看所有ASCII码
字符串常量
说明:在C语言中,支持字符串常量,不支持字符串变量。字符串变量需要使用字符数组或者字符指针实现。
-
用一对双引号
""
括起来的一个字符序列,如:
"How do you do?"
"hello world!"
"12"
"true"
"12.35"
-
可以使用print输出一个字符序列,如:
printf("%s","hello world!\n");
printf("hello world!\n"); // 等价于上面写法
注意:
字符常量'a'与字符串常量"a"的区别:
系统自动为字符串常量加上结尾的 \0 ,使所占内存单元多一个,单字符常量的长度不变,可用sizeof()运算符来测量。
符号常量
说明:一般通过宏定义,在预处理的时候替换成具体的常量
定义一个标识符来代表一个常量,如:用PI表示圆周率π(3.1415926)
好处:
-
增加代码的可读性
-
#include <stdio.h> // 定义符号常量 #define PI 3.14 #define R 20 int main(int argc,char *argv[]) { // 计算圆的周长 2 × PI × R printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示 // 计算圆的面积 PI × R × R printf("计算圆的面积:%f\n",PI * R * R); return 0; }
增强了代码的可维护性
-
定义符号常量:
-
需要借助预处理指令: #define
-
格式:
#define 宏名称 宏值
-
注意:
-
宏名称和宏值之间用空格隔开
-
句末不能添加任何符号
-
无参的宏名称的命名采用大写,如果有多个单词,使用下划线分隔,举例:
-
#define MAX_VAL 9999
#define MIN_VAL 1000
-
举例:
#include <stdio.h>
// 定义符号常量
#define PI 3.14
#define R 20
int main(int argc,char *argv[])
{
// 计算圆的周长 2 × PI × R
printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
// 计算圆的面积 PI × R × R
printf("计算圆的面积:%f\n",PI * R * R);
return 0;
}
日常错误
-
问题描述:编译过程中,控制台出现类似于
\357
这样的错误 -
解答:一般都是代码中使用了中文标点符号导致的
-
演示: