计算机基础
为什么学C语言需要了解计算机基础?
C语言是一门贴近硬件的编程语言,它允许直接操作内存地址和寄存器。如果不了解计算机的基本组成和工作原理,就很难理解C语言中的"指针"、"内存"、"编译"等核心概念。
计算机的组成
计算机的定义与组成
定义:能进行计算以及逻辑处理的设备。
组成:软件(计算机中运行的程序和数据),硬件(计算机的物理部件:内存条、CPU硬盘等)
计算机的六大部件
| 类型 | 功能说明 |
|---|---|
| 中央处理器(CPU) | 负责控制指令执行和数据计算 |
| 内存 | 用于临时存储程序运行时的指令和数据 |
| 输入设备 | 指向计算机输入数据(如:键盘,鼠标,扫码枪等) |
| 输出设备 | 指将计算机处理结果输出(如:显示器,打印机等) |
| 外存设备 | 永久存储数据(如:硬盘,U盘等) |
| 网络 | 实现设备间的数据传输与通信 |
计算机的工作原理
程序存储:程序和数据预先存储在内存中
程序控制:CPU按照指令顺序逐条执行
计算机语言
| 语言类型 | 特点 |
|---|---|
| 机器语言 | 二进制代码,可直接控制硬件,效率最高 |
| 汇报语言 | 用助记符表示机器指令,需通过汇编器翻译为机器语言 |
| 高级语言 | 贴近人类自然语言,可读性强,需要编译/解释执行 |
C语言简史与特点
2.2.1 C语言的起源
其前身是 B 语言;
B 语言由美国贝尔实验室的 Ken Thompson(肯·汤普森)于 1969 年开发,并用其编写了初版 UNIX 系统;
1972 年,美国贝尔实验室的 Dennis Ritchie(丹尼斯·M·里奇)在 B 语言基础上开发出 C 语言,C 语言提供了丰富的数据类型和标识符,使程序编写更高效便捷;
1973 年初,C 语言主体完成,汤普森和里奇随即用 C 语言完全重写了 UNIX 系统。
2.2.2 C语言的标准
为推动 C 语言规范化发展,美国国家标准协会(ANSI)于 1982 年成立委员会制定 C 语言标准:
| 年份 | 标准名称 | 说明 |
|---|---|---|
| 1989 | C89(ANSI C) | ANSI 发布首个完整 C 语言标准 |
| 1990 | C90(ISO C) | ISO 一字不改采纳 C89 |
| 1999 | C99 | ISO 发布修订完善后的标准 |
| 2011 | C11 | ISO/IEC 9899:2011 |
| 2018 | C18 | 主要修复 C11 的技术漏洞 |
| 2023 | C23 | 新增#embed、nullptr、typeof/typeof_unqual、constexpr增强、十进制浮点类型、空初始化器{}、属性语法[[]]等特性 |
2.2.3 C语言特点
简洁高效,支持底层硬件操作(可直接访问内存地址,操作寄存器)
可移植性强、符合标准的C程序可在不同平台(Windows、Linux、嵌入式设备)间轻松移植
适合结构化编程,代码模块化程度高、容易维护、容易调试
生成代码质量高、执行速度快(接近汇编语言)
C语言程序的开发过程
开发的三个步骤
1.编辑:由程序员编写的源代码程序(.c文件)
2.编译:由编译器将源代码转换为计算机可执行的二进制指令文件
3.运行:由操作系统加载并执行二进制程序
C语言程序编译的过程
编译的四个过程:
| 编译步骤 | 功能说明 | 命令 | 文件类型转换 |
|---|---|---|---|
| 预处理 | 是处理宏定义(#define),头文件(#include)、注释等,将头文件内容直接拷贝到当前文件。预处理需要用到预处理器 | gcc -E *.c -o *.i | .c→.i |
| 编译 | 对预处理后的代码进行语法分析,语义检查,生成汇编语言代码。编译要用到编译器 | gcc -S *.c -o *.s | .i/.c→.s |
| 汇编 | 将汇编代码转换为二进制代码,生成目标文件。汇编要用到汇编器 | gcc -c *.s -o *.o | .s→.o |
| 链接 | 将目标文件与系统库文件、其他目标文件合并,生成可执行文件。链接要用到链接器 | gcc *.c -o * | .o→可执行文件 |
C语言的基本结构
简单C语言程序
示例代码
/************************************************************************* > File Name: dem01.c > Author: XXX > Description:程序结构:第一个C语言程序,输出 Hello World > Created Time: 2026年07月27日 星期一 20时35分42秒 ************************************************************************/ #include <stdio.h> //引入输入输出标准库头文件 int main(int argc,char *argv[]) //主函数:一个 .c 程序里有且仅有一个 { printf("hello world\n"); // C标准库提供的函数:向控制台输出 Hello World! \n是换行的意思,需要引入<stdio.h> return 0; } //运行结果 hello worldCV大法:
Linux终端 → Windows:
Ctrl + Shift + C→Ctrl + VWindows → Linux终端:
Ctrl + C→Ctrl + Shift + V
程序结构分析
注释:用于解释代码逻辑,仅给程序员阅读。注释在编译的早期翻译阶段(预处理阶段)被替换为空格,不参与后续编译。
预处理指令:以
#开头,用于包含头文件、宏定义等,如#include <stdio.h>,#define PI 3.14159主函数(
main函数):程序的唯一入口,由操作系统通过程序启动机制自动调用,不能被程序员自定义函数调用。函数组成:
函数头:说明函数的返回值类型、函数名和参数列表。在C语言中,
int main(void)明确表示无参数,int main()表示参数未指定(与C++不同,C中二者语义有区别)。若无参数,建议统一使用int main(void)或int main(int argc, char *argv[])函数体:用
{}括起来,包含变量声明和语句执行的部分(语句以;结尾)
函数调用语句:调用已定义的函数(如:printf,是标准库中的输出函数)
C语言的程序规范
格式缩进
推荐缩进4个空格(或配置编辑器将Tab键显示宽度设为4个字符),统一代码层级。
足够注释
对于关键代码(如函数功能、复杂逻辑、变量含义)添加注释。
适当空行
预处理指令与函数之间、函数与函数之间、全局变量与函数之间添加空行,区分代码模块。
示例代码
/************************************************************************* > File Name: demo02.c > Author: XXX > Description: 编程规范:宏定义与空行使用示例 ************************************************************************/ // 包含头文件,预处理时,会将对应的.h文件代码全部拷贝到当前文件位置 #include <stdio.h> #include <stdlib.h> // 宏定义:预处理阶段,会使用宏值替换掉宏名称,称作宏展开 #define R 2 // 定义一个半径 #define PI 3.14159 int main(int argc, char *argv[]) { // 向控制台输出hello world! printf("hello world!\n"); // 计算圆的面积 double area = PI * R * R; //预处理:double area = 3.14159 * 2 * 2 printf("%lf\n", area); return 0; } //运行结果 hello world! 12.566360{}对齐
#不推荐以下分格(多用在Java) int fun(){ ... } #推荐风格(多用于C/C++) int fun() { ... }分层缩进与模块化
函数体内的代码按逻辑层次缩进,复杂逻辑拆分模块化
int fun() { if (...) { for(...) { printf(); } } if (...) { printf(); } }单句单行
不将多条语句写在同一行
int main() { // 不推荐的写法 printf("第1行\n"); printf("第2行\n"); printf("第3行\n"); // 推荐的写法 printf("第1行\n"); printf("第2行\n"); printf("第3行\n"); }标识符命名
函数名、变量名等都叫标识符,命名要见名知意,使用英文单词或短语,避免无意义的字母
int main() { // 不推荐的写法 int a = 21; int b = 168; int c = 190; // 推荐的写法 int age = 21; // 年龄:21 int height = 168; // 身高:168 int weight = 190; // 体重:190 return 0; }C语言中的注释
C语言中代码注释分为单行注释和多行注释,不参与代码编译,在预处理前计算机系统就删除了。
| 注释分类 | 语法格式 | 使用场景 |
|---|---|---|
| 单行注释 | 用//开头,注释到这一行结束 | 变量说明,常量说明,函数调用语句等 |
| 多行注释 | 用/* 注释内容 */,可跨行注释,但不能嵌套 | 头文件说明,函数功能说明等 |
示例代码
#include <stdio.h> int main(int argc,char *argv[]) { //单行注释 //printf("int的大小=%ld\n",sizeof(int)); //多行注释 /*int a=10; printf("%d\n",a);*/ return 0; }备注:文档注释(扩展):本质上还是多行注释,用于生成标准化文档,格式更规范,一般替代传统的多行注释。
示例代码
/** * @brief 函数名:main * @author 开发者姓名 * @date 开发时间 * @param argc 解释参数 * @param argv 解释参数 * @return 返回值说明 */