计算机基础
计算机的组成
计算机的定义
计算机:能进行计算及逻辑处理的设备。
硬件:组成计算机的物理部件(硬盘,内存条,CPU等)
开发中对于硬件的认知:硬件包括电子设备、单片机、集成电路和嵌入式系统。
软件:计算机中运行的程序和数据
开发中对于软件的认知:软件分为系统软件(OS)、应用软件、编程工具(编译器)
计算机的六大部件
中央处理器(CPU):负责控制指令执行和数据计算。
内存:临时存储程序运行时的指令和数据。
输入设备:向计算机输入数据(鼠标,键盘,扫码枪等)。
输出设备:将计算机处理结果输出(显示器,打印机等)。
外存设备:永久存储数据(硬盘,U盘等)。
网络:实现设备间数据的传输和通讯。
计算机工作原理
存储程序:程序和数据预先存储在内存里。
程序控制:CPU按照指令顺序逐条执行操作。
计算机工作语言
| 语言类型 | 特点 | 示例 |
|---|---|---|
| 机器语言 | 二进制代码,可直接控制硬件,执行效率最高 | 1011110 010100010 |
| 汇编语言 | 用助记符表示机器指令,需通过汇编器翻译为机器语言 | MOV AL, 61h0、 |
| 高级语言 | 贴近人类自然语言,可读性强,需要编译/解释执行 | printf(“hello world”) |
C语言程序的开发过程
开发的三个步骤
①编辑:程序员编写源程序 .c文件。
②编译:编译器将源代码转换为可执行的二进制指令文件。
③运行:操作系统加载并执行可执行二进制程序。
C语言程序的编译过程
上面提到编译分为四个步骤:
预处理
预处理:软件分为系统软件(OS)、应用软件、编程工具(编译器):处理宏定义(#define),头文件包含(#include)、注释等,将头文件内容直接拷贝到当前文件。预处理需要用到预处理器。
命令:gcc -E *.c -o *.i
文件类型转换:*.c → *.i
说明:生成预处理后的C代码(文本文件)
yueqian@yueqian-vm:~$ gcc-Edeom1.c-odeom1.i yueqian@yueqian-vm:~$catdeom1.i编译
编译:对预处理后的代码进行语法分析,语义检查,生成汇编语言代码。编译要用到编译器。
命令:gcc -S *.c -o *.s
文件类型转换:.i/.c → *.s
说明:生成汇编代码(文本文件)
yueqian@yueqian-vm:~$ gcc-Sdeom1.i-odeom1.s yueqian@yueqian-vm:~$catdeom1.s汇编
.汇编:将汇编代码转换为二进制代码,生成目标文件。汇编要用到汇编器。
命令:gcc -c *.s -o *.o
文件类型转换:*.s → *.o
说明:将汇编代码转为二进制目标文件(注:gcc -c *.c 等价于预处理+编译+汇编三步)
yueqian@yueqian-vm:~$ gcc-cdeom1.s-odeom1.o yueqian@yueqian-vm:~$catdeom1.o链接
链接:将目标文件与系统库文件、其他目标文件合并,生成可执行文件。链接要用到链接器。
命令:gcc *.c -o *
文件类型转换:*.o →可执行文件
说明:生成可执行二进制文件
C语言程序的基本结构
一个简单的C语言程序
功能:在控制台(终端)输出“Hello World!”
/************************************************************************* > File Name: deom1.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月28日 星期二 19时34分38秒 ************************************************************************/#include<stdio.h>//引入输入输出标准库头文件,printf()需要这个头文件//主函数:一个*.c有且仅有1个主函数,作为程序的入口,这个函数在程序运行后自动执行intmain(intargc,char*argv[]){//C标准库提供的函数:向控制台输出Hello World,\n是换行的意思,需要引用<stdio.h>printf("Hello World\n");return0;}#运行结果yueqian@yueqian-vm:~$ ./a.out Hello World程序结构分析
①注释:用于解释代码逻辑,仅给程序员阅读。注释在编译的早期翻译阶段(预处理)被替换为空格,不参与后续编译。
②预处理指令:以 # 开头,用于包含头文件、宏定义等,如 #include <stdio.h> , #define PI 3.1415926。
③主函数( main 函数):程序的唯一入口,由操作系统通过程序启动机制自动调用,不能被程序员自定义函数调用。
④函数组成:
– 函数头:说明函数的返回值类型、函数名和参数列表。在C语言中, int main(void) 明确表示无参数,int main() 表示参数未指定(与C++不同,C中二者语义有区别)。若无参数,建议统一使用 intmain(void) 或 int main(int argc, char *argv[])
– 函数体:用 {} 括起来,包含变量声明和语句执行的部分(语句以 ; 结尾)
⑤函数调用语句:调用已定义的函数(如: printf ,是标准库中的输出函数)
C语⾔编程规范
C语言编程需要遵循以下规范,提升代码的可读性和可维护性
缩进格式
推荐缩进4个空格(或配置编辑器将Tab键显示宽度设为4个字符),统一代码层级。
⾜够注释
对于关键代码(如函数功能、复杂逻辑、变量含义)添加注释。
合适空⾏
预处理指令与函数之间、函数与函数之间、全局变量与函数之间添加空行,区分代码模块:
/************************************************************************* > File Name: deom1.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月28日 星期二 20时10分45秒 ************************************************************************/// 包含头文件,预处理时,会将对应的.h文件代码全部拷贝到当前文件位置#include<stdio.h>#include<stdlib.h>// 宏定义:预处理阶段,会使用宏值替换掉宏名称,称作宏展开#defineR2// 定义一个半径#definePI3.1415926intmain(intargc,char*argv[]){//向控制台输出Hello Worldprintf("Hello World\n");// 计算圆的面积doublearea=PI*R*R;// 预处理后:double area = 3.1415926 * 2 * 2printf("%lf\n",area);return0;}#运行结果yueqian@yueqian-vm:~$ ./a.out Hello World12.566370{}对⻬
推荐(C/C++风格)
intfun(){...}分层缩进与模块化
函数体内的代码按逻辑层次缩进,复杂逻辑拆分模块化:
intfunc(){if(..){for(..){printf("hello\n");}}if(..){for(..){printf("hello\n");}}}单句单⾏
不将多条语句写在同一行
intmain(){// 不推荐的写法printf("第1行\n");printf("第2行\n");printf("第3行\n");// 推荐的写法printf("第1行\n");printf("第2行\n");printf("第3行\n");}标识符命名
函数名、变量名等都叫标识符,命名要见名知意,使用英文单词或短语,避免无意义的字母
intmain(){// 不推荐的写法inta=21;intb=168;intc=190;// 推荐的写法intage=21;// 年龄:21intheight=168;// 身高:168intweight=190;// 体重:190return0;}C语⾔中的注释
C语言注释分为单行注释和多行注释,作用是解释代码、屏蔽临时无用代码、不参与编译(在预处理阶段删除)。
单⾏注释
格式:用 // 开头,注释从 // 到行尾
适用场景:变量说明、常量说明、函数调用语句、简单逻辑注释
// 注释内容// 预处理指令:引入系统标准输入输出库(printf函数需要用到)#include<stdio.h>intmain(){// 向控制台输出 hello world! \n是换行符,必须写在 "\n" 内部printf("hello world!\n");return0;}多⾏注释
格式:用 /* 开头,以 */ 结尾,可单行,可跨多行,不能嵌套
适用场景:文件头说明、函数功能说明、复杂代码块注释
/* 注释内容 *//* 注释内容 注释内容 *//* 函数名:main 功能:程序入口,输出hello world! 返回值:0-表示程序正常结束 */intmain(){...}⽂档注释
文档注释本质上还是多行注释,用于生成标准化文档,格式更加规范,一般替代传统的多行注释。
/** * @brief 函数名:main * @author 开发者姓名 * @date 开发时间 * @param argc 解释参数 * @param argv 解释参数 * @return 返回值说明 */intmain(intargc,char*argv[]){...return0;}数据类型
数据类型决定了数据在内存中如何存储?需要多大空间?
数据:计算机需要处理的信息(数字、文字、符号、图片、音视频等),程序运行时所有数据都需要加载到内存中。
数据类型分类
基本类型(内置类型)
– 整型(数值类型,存储整数)
短整型: short ( short int 的表示),2个字节
基本型: int (使用频率最高),4个字节
长整型: long ( long int 的表示),32位系统4字节,64位系统8字节
长长整型: long long ( long long int ,C99新增标准)
– 浮点型(数值类型,存储小数/实数)
单精度型: float ,4个字节
双精度型: double ,8个字节
长双精度型: long double
– 字符型: char (存储单个字符,本质是ASCII码值),1个字节
构造类型(用户基于C语言语法定义)
指针类型(存储内存地址)
空类型
void (表示无类型,用于函数返回值,函数形参,指针类型),举例: main(void) 等价于 main()
数据类型在内存中的大小
| 数据类型 | 中文说明 | 大小(字节) | 常见取值范围 |
|---|---|---|---|
| short | 短整型 | 2 | -32768~32767 |
| int | 基本整型 | 4 | -2147483648 ~ 2147483647 |
| long | 长整型 | 4(32位系统)/8(64位系统) | 32位:同int;Linux 64位:-9223372036854775808 ~9223372036854775807;Windows 64位:同32位(-2147483648 ~ 2147483647) |
| long long | 长长整型 | 8 | -9223372036854775808 ~ 9223372036854775807 |
| float | 单精度浮点型 | 4 | 约 ±3.4×10³⁸(精度 6~7 位有效数字) |
| double | 双精度浮点型 | 8 | 约 ±1.7×10³⁰⁸(精度 15~16 位有效数字) |
| char | 字符型 | 1 | -128 ~ 127(有符号)/ 0 ~ 255(无符号) |
| bool(_Bool,C99新增) | 布尔型 | 1 | true(非 0)、false(0) |
注意: 计算机存储最小单位是 bit (位),1个 bit 仅能存储0或1;程序中最小操作单位是 Byte (字
节),1字节 = 8位;C语言中没有 Byte 这个单位,我们使用 char 表示字节。也就是 1 char =
8 bit 。
sizeof运算符使用示例
sizeof运算符,用来计算数据类型或者变量的大小,返回的是字节数
/************************************************************************* > File Name: demo01.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月29日 星期二 17时25分31秒 ************************************************************************/#include<stdio.h>intmain(intargc,char*argv[]){printf("int的大小=%ld字节\n",sizeof(int));printf("double的大小=%ld字节\n",sizeof(double));return0;}#运行结果int的大小=4字节 double的大小=8字节总结:
① 数据类型的字节大小与C语言编译系统(32位/64位)、操作系统相关;
②sizeof是运算符(非函数),计算结果为无符号整数(只有正整数,没有负整数);
常量
常量是程序执行过程中值不可改变的量,与变量一样需要用到内存空间存储。
整型常量
整型常量有十进制、八进制、十六进制三种表示形式;
表示形式
十进制常量
– 组成:数字0~9,不能以0开头,0自身除外
– 注意:不能表示小数
– 示例:正确写法:99,298,0
错误写法:06,000
八进制常量
– 组成:数字0~7,以0为前缀(不可省略)
– 注意:不能表示小数
– 示例:正确写法:03,062,000
错误写法:039,255
十六进制常量
– 组成: 0~9 + a~f / A~F ,以 0x/0X 为前缀
– 注意:不能表示小数
– 示例:0xFFAEFBF、0X123、0x0/0x00000000
后缀说明
长整型常量:在数值后加L/l,推荐用L
示例:long num = 123L明确指定为长整型,此时的 L 只起到一个标识作用,数值依然是123
有符号和无符号
有符号(默认):表示范围为负数 + 0 + 正数,如char的有效范围是-128~127,可以在类型前添加修饰关
键字signed,一般省略。
// 以下两行代码完全等价signedinta=10086;inta=10086;无符号:表示范围 0 + 正数 (内存中负数位用来存储正数,正数范围更大),如 char 的无符号范围是
0~255,需要再类型前添加修饰关键字unsigned。
unsignedcharnum=100;// 只能存储 0 ~ 255char(有符号)范围:-128~127
char(无符号)范围:0~255
浮点型常量
浮点型常量(小数/实数)有两种表示方式:
十进制小数形式
组成:数字0~9,小数点 . ,必须包含小数点(即使整数部分为0或小数部分为0)
示例:0.123(double,默认) /0.123F(float)、-12.6、3.0、0.0
注意:
– float 类型常量需要在末尾添加F/f,默认浮点型常量为 double 类型。
– 示例:float f = 0.12F(明确指定为单精度浮点型)
指数形式(科学计数法)
格式:数字 e/E整数指数,e/E表示10的幂次。
示例:
– 正数: 12345.67→1.234567*10^4→1.23467e+4或1.234567e4(十进制小数形式 → 指数形式)
– 负数: 0.0147→1.47*10^2→1.47e-2(十进制小数形式 → 指数形式)
注意:
– e/E 前面必须有数字( 0~9 ),其中小数点前的整数部分取值范围为 1~9 (前导零 0 在数值上无意义,但C语法允许)
– e/E 后面必须是整数(不能带小数),错误示例: 1.2345e3.5
– 单精度常量需要加 f/F ,如 1.2345e3F (float)、 1.2345e3 (double,默认)
字符型常量
普通字符常量
格式:用单引号 ‘’ 括起来的单个字符。英文输入法下的字母、数字、符号等ASCII规范的字符。
示例:
– 正确示例:如 ‘a’ , ‘A’ , ‘5’ , ‘_’ , ‘+’ , ‘\n’
– 错误示例:如 ‘软’ , “a”
本质:硬件存储的是ASCII规范的字符的ASCII码值,如 a 的ASCII码值为 97 , A 的ASCII码值为 65 ,数字为48
转义字符常量
以反斜杠 \ 开头的特殊的字符序列,用于表示控制字符或不可见字符(如换行符、制表符),常见转义符如下:
| 字符形式 | ASCII码 | 中文解释 | 用途 |
|---|---|---|---|
'\n' | 10 | 换行 | 光标移动至下一行开头 |
'\r' | 13 | 回车 | 光标移动至当前行开头 |
'\0' | 0 | 空字符 | 字符串结束标志(重要) |
'\t' | 9 | 水平制表符 | 相当于按Tab键(8个空格) |
'\\' | 92 | 反斜杠 | 表示字符\ |
'\'' | 39 | 单引号 | 表示字符' |
'\"' | 34 | 双引号 | 表示字符" |
在 Linux 终端输入 man ascii 可查看所有 ASCII 字符及对应码值。
字符串常量
定义
用双引号""括起来的字符序列(可包含多个字符、数字、符号),C语言无内置的字符串类型,字符串常量和变量均需要通过字符数组或者字符指针来实现。字符串常量末尾自动添加\0结束标记,但是这个标志是看不见的,也不会显示输出。
示例
"How are you ? "// 实际存储:How are you ? \0"hello world"// 实际存储:hello world\0"123456"// 实际存储:123456\0""// 实际存储:\0输出
通过printf函数的%s格式输出:
printf("hello world!\n");// 推荐,内部补充%s// 等价于printf("%s","hello world!\n");与字符常量的区别
| 对比项 | 字符常量(如:‘a’) | 字符串常量(如:“a”) |
|---|---|---|
| 定界符 | 单引号'' | 双引号"" |
| 内存占用 | 1字节(存储ASCII码) | 2字节('a' + '\0') |
| 结束标志 | 无 | 自动添加\0,字符串结束标志 |
| 表示范围 | 仅单个字符 | 可多个字符或空 |
关键:字符串常量末尾会被系统自动添加\0,用于标识字符串结束,这是字符串与字符常量的核心区别。
符号常量(无参宏定义)
定义
通过预处理指令#define定义的标识符,用于代表一个固定常量(预处理阶段,会直接替换成宏值)
优点
增强代码的可读性(用有意义的标识符代替魔法数字)
提升代码的可维护性(需修改常量时,仅需要修改宏定义,无需逐个修改代码)
语法格式
#define宏名称 宏值注意事项
① 宏名称与宏值之间用空格隔开;
② 行末不能加;(否则替换是会带入分号,导致语法错误)
③ 宏名称命名规范:字母(A~Za~z)+ 数字(0~9)+ 下划线(_),不能以数字开头。习惯上宏名使用全大写(如MAX_VALUE),小写字母也合法但较少用于宏(如max_value)
示例代码
源程序:
/************************************************************************* > File Name: demo03.c > Author: 蒋文辉 > Description: > Created Time: 2026年07月29日 星期二 19时01分30秒 ************************************************************************/#include<stdio.h>// 定义PI// 语法:#define 全大写宏名 宏值#definePI3.1415926intmain(intargc,char*argv[]){// 实现一个圆的面积计算// 创建一个变量,用来存放圆的半径doubler=10;// 计算圆的面积doublearea=PI*r*r;printf("圆的面积是:%f\n",area);// 计算圆的周长doublec=2*PI*r;printf("圆的周长是:%f\n",c);return0;}预处理后:
...#14"demo03.c"intmain(intargc,char*argv[]){doubler=10;doublearea=3.1415926*r*r;printf("圆的面积是:%f\n",area);doublec=2*3.1415926*r;printf("圆的周长是:%f\n",c);return0;}运行结果:
yueqian@st-vm:/mnt/hgfs/Code/20260729$ gcc demo03.c yueqian@st-vm:/mnt/hgfs/Code/20260729$ ./a.out 圆的面积是:314.159260 圆的周长是:62.831852