第1章 C语言概述与环境搭建
1.1 C语言简介
C语言是一种通用的、过程式的计算机编程语言,由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室于1972年开发。它的设计初衷是为了编写UNIX操作系统,后来逐渐发展成为一种广泛使用的编程语言。C语言是许多现代编程语言的基础,如C++、Java、Python等都深受其影响。
1.1.1 C语言的发展历史
C语言的发展可以追溯到20世纪60年代:
- 1967年:马丁·理查德(Martin Richards)开发了BCPL(Basic Combined Programming Language)语言
- 1970年:肯·汤普森(Ken Thompson)在BCPL基础上开发了B语言,用于编写UNIX操作系统
- 1972年:丹尼斯·里奇(Dennis Ritchie)在B语言基础上开发了C语言,增加了数据类型和结构体
- 1978年:布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇出版了《The C Programming Language》(第一版),成为C语言的权威参考
- 1989年:ANSI(美国国家标准协会)发布了C语言标准,称为C89或ANSI C
- 1990年:ISO(国际标准化组织)采纳了C89标准,称为C90
- 1999年:ISO发布了C99标准,增加了布尔类型、可变长度数组等新特性
- 2011年:ISO发布了C11标准,增加了多线程支持、泛型宏等新特性
- 2018年:ISO发布了C17标准,主要是对C11的修正和改进
- 2023年:ISO发布了C23标准,增加了许多现代化特性
1.1.2 C语言的特点
- 高效性:C语言编译后的程序执行速度快,内存占用小,接近汇编语言的性能
- 灵活性:C语言提供了丰富的运算符和数据类型,允许直接访问内存地址
- 可移植性:C语言程序可以在不同的计算机系统上编译运行,只需少量修改
- 强大的功能:C语言支持指针、结构体、联合体、位运算等高级特性
- 模块化设计:C语言支持函数和文件分离,可以实现模块化编程
- 广泛的应用:操作系统、编译器、数据库、游戏引擎等都可以用C语言开发
- 简洁的语法:C语言语法简洁,关键字少,易于学习和使用
1.1.3 C语言与其他语言的关系
- C++ :是C语言的扩展,增加了面向对象编程特性,完全兼容C语言
- Java:语法借鉴了C++,但运行在虚拟机上,具有自动内存管理
- Python:语法简洁,是解释型语言,底层很多模块用C语言实现
- C# :微软开发的语言,语法借鉴了C++和Java,主要用于Windows平台
- Go:谷歌开发的语言,语法简洁,内置并发支持,底层用C语言实现
1.1.4 C语言的应用领域
- 操作系统:如Linux、Windows内核、macOS内核
- 嵌入式系统:如单片机、物联网设备、智能家居产品
- 游戏开发:如游戏引擎(Unity、Unreal Engine的核心部分)、游戏服务器
- 数据库系统:如MySQL、PostgreSQL、SQLite
- 编译器和解释器:如GCC、Clang、Python解释器
- 图形界面库:如GTK、Qt、SDL
- 网络编程:如网络协议栈、Web服务器(Apache、Nginx)
- 科学计算:如数值计算库、仿真软件
- 人工智能:如深度学习框架的底层实现(TensorFlow、PyTorch的核心)
章节趣事:C语言名称的由来
C语言的名称来源于B语言,而B语言的名称则来源于BCPL语言。BCPL是Basic Combined Programming Language的缩写,是一种早期的编程语言。
丹尼斯·里奇(Dennis Ritchie)和肯·汤普森(Ken Thompson)在开发UNIX操作系统时,最初使用的是汇编语言。后来,他们为了提高开发效率,开发了B语言,然后在B语言的基础上开发了C语言。
《The C Programming Language》一书通常被称为“K&R”,这是因为它的作者是Brian Kernighan和Dennis Ritchie。这本书被广泛认为是C语言的经典教材,对C语言的发展产生了深远的影响。
1.2 开发环境搭建
要学习C语言,首先需要搭建C语言的开发环境。开发环境主要包括编译器和集成开发环境(IDE)。
疑难解析:为什么需要搭建开发环境?
C语言是一种编译型语言,需要通过编译器将源代码转换为可执行程序才能运行。开发环境提供了编写、编译、运行和调试C程序的工具链,是学习和开发C语言的必要条件。
1.2.1 编译器选择
编译器是将C语言源代码转换为可执行程序的工具,它负责词法分析、语法分析、语义分析、优化和代码生成等工作。选择合适的编译器对于C语言学习和开发至关重要。
易错部分:编译器选择误区
- 认为越贵的编译器越好:实际上,开源的GCC和Clang编译器功能强大,支持最新的C标准,完全满足学习和开发需求。
- 忽略编译器对C标准的支持:不同编译器对C标准的支持程度不同,在学习新特性时需要注意编译器是否支持。
- 不关注编译器版本:新版本编译器通常支持更多特性,修复了旧版本的bug,建议使用较新的编译器版本。
1. 主要编译器详细比较
| 编译器 | 开发者 | 开源情况 | 支持的标准 | 编译速度 | 优化能力 | 错误信息 | 适用平台 | 主要优势 |
|---|---|---|---|---|---|---|---|---|
| GCC | GNU社区 | 开源免费 | C89/C90/C99/C11/C17/C23 | 中等 | 强大 | 较详细 | Windows、Linux、macOS | 功能全面,支持多种架构,广泛应用 |
| Clang | LLVM项目 | 开源免费 | C89/C90/C99/C11/C17/C23 | 快 | 强 | 友好、详细 | Windows、Linux、macOS | 编译速度快,错误信息清晰,模块化设计 |
| MSVC | Microsoft | 闭源商业 | C89/C90/C99(部分)/C11(部分)/C17(部分) | 快 | 强 | 详细,与VS集成 | Windows | 与Windows系统兼容性好,调试工具强大 |
| Intel C++ Compiler | Intel | 闭源商业 | C89/C90/C99/C11/C17 | 中等 | 极强 | 详细 | Windows、Linux、macOS | 针对Intel架构优化,性能优异 |
| TCC | Fabrice Bellard | 开源免费 | C89/C90/C99(部分) | 极快 | 弱 | 简单 | Windows、Linux、macOS | 编译速度极快,适合快速原型开发 |
2. 编译器版本与C标准支持
不同编译器版本对C标准的支持程度不同,以下是主要编译器对C标准的支持情况:
| 编译器 | C89/C90 | C99 | C11 | C17 | C23 |
|---|---|---|---|---|---|
| GCC 13 | 完全支持 | 完全支持 | 完全支持 | 完全支持 | 部分支持 |
| Clang 16 | 完全支持 | 完全支持 | 完全支持 | 完全支持 | 部分支持 |
| MSVC 2022 | 完全支持 | 大部分支持 | 大部分支持 | 部分支持 | 实验性支持 |
3. 编译器命令行使用基础
对于高级用户,了解编译器的命令行使用非常重要。以下是GCC编译器的基本命令格式:
gcc [选项] 源文件 [选项]
常用选项:
-o 输出文件名:指定输出文件的名称-c:只编译不链接,生成目标文件(.o)-S:只编译到汇编代码,生成汇编文件(.s)-E:只进行预处理,生成预处理文件(.i)-Wall:显示所有警告信息-Werror:将警告视为错误-std=c11:指定使用C11标准-O2:启用二级优化-g:生成调试信息,用于调试器
示例:
gcc -o hello hello.c # 编译并链接hello.c,生成可执行文件hello
gcc -c hello.c # 只编译hello.c,生成目标文件hello.o
gcc -Wall -Werror -std=c11 hello.c # 启用所有警告,将警告视为错误,使用C11标准编译
1.2.2 IDE选择
IDE(集成开发环境)是集成了编辑器、编译器、调试器、代码补全、语法高亮等工具的软件,方便开发者编写、编译和调试程序。选择合适的IDE可以大大提高开发效率。
1. IDE选择考虑因素
- 易用性:界面友好,操作简单,适合初学者
- 功能完整性:包含编辑器、编译器、调试器等必要工具
- 性能:启动速度快,占用内存少
- 跨平台支持:支持多种操作系统
- 扩展性:支持插件扩展,可根据需要添加功能
- 社区支持:有活跃的社区,提供大量教程和资源
2. 主流IDE详细介绍
2.1 Dev-C++(推荐初学者)
Dev-C++是一款轻量级的C/C++ IDE,基于GCC编译器,适合初学者使用。
| 特点 | 详细说明 |
|---|---|
| 体积 | 约50MB,下载和安装快速 |
| 界面 | 简洁直观,适合初学者 |
| 编译器 | 集成MinGW GCC编译器 |
| 功能 | 基本的代码编辑、编译、调试功能 |
| 支持标准 | 支持C89/C90/C99,部分支持C11 |
| 优点 | 安装简单,使用方便,适合入门学习 |
| 缺点 | 功能相对简单,不支持现代C++标准,调试功能有限 |
下载地址:sourceforge.net/projects/or…
2.2 Visual Studio
Visual Studio是微软推出的功能强大的IDE,适合Windows用户,支持多种编程语言。
| 特点 | 详细说明 |
|---|---|
| 体积 | 约2-5GB,安装时间较长 |
| 界面 | 现代化,功能丰富 |
| 编译器 | 集成MSVC编译器 |
| 功能 | 强大的代码编辑、智能提示、调试、性能分析等功能 |
| 支持标准 | 支持C89/C90,部分支持C99/C11/C17 |
| 优点 | 功能全面,调试工具强大,与Windows系统兼容性好 |
| 缺点 | 体积大,安装时间长,资源占用高 |
下载地址:visualstudio.microsoft.com/
2.3 Code::Blocks
Code::Blocks是一款开源的C/C++ IDE,跨平台支持,适合多种操作系统。
| 特点 | 详细说明 |
|---|---|
| 体积 | 约100MB,安装包较小 |
| 界面 | 简洁,功能布局清晰 |
| 编译器 | 支持GCC、Clang、MSVC等多种编译器 |
| 功能 | 完整的代码编辑、编译、调试功能,支持插件扩展 |
| 支持标准 | 支持C89/C90/C99/C11/C17 |
| 优点 | 开源免费,跨平台,支持多种编译器,功能完善 |
| 缺点 | 界面相对简陋,更新较慢 |
下载地址:www.codeblocks.org/
2.4 CLion
CLion是JetBrains公司推出的跨平台C/C++ IDE,基于IntelliJ平台。
| 特点 | 详细说明 |
|---|---|
| 体积 | 约1GB,安装包适中 |
| 界面 | 现代化,美观易用 |
| 编译器 | 支持GCC、Clang、MSVC等多种编译器 |
| 功能 | 智能代码补全、重构、调试、性能分析、版本控制等 |
| 支持标准 | 支持C89/C90/C99/C11/C17/C23 |
| 优点 | 智能功能强大,用户体验好,跨平台 |
| 缺点 | 商业软件,需要付费,资源占用较高 |
2.5 Visual Studio Code
Visual Studio Code(VS Code)是微软推出的轻量级跨平台代码编辑器,可通过插件扩展为IDE。
| 特点 | 详细说明 |
|---|---|
| 体积 | 约100MB,非常轻量 |
| 界面 | 现代化,简洁美观 |
| 编译器 | 需要单独安装编译器(如MinGW GCC、Clang) |
| 功能 | 通过插件扩展,可支持代码编辑、智能提示、调试、版本控制等 |
| 支持标准 | 取决于安装的编译器和插件 |
| 优点 | 轻量级,启动快,插件丰富,跨平台 |
| 缺点 | 需要手动配置编译器和插件,对初学者不够友好 |
章节练习:开发环境选择
- 根据你的操作系统,选择一个适合的C语言编译器,并说明选择理由。
- 调查你选择的编译器对C23标准的支持情况。
- 选择一个适合你的IDE或代码编辑器,并说明选择理由。
1.2.3 详细安装步骤
1. Dev-C++详细安装步骤
- 下载安装包:访问Dev-C++官网,点击“Download”按钮下载最新版本的安装包
- 运行安装包:找到下载的安装包(通常为exe文件),双击运行
- 选择语言:在弹出的安装向导中,选择“中文简体”,点击“OK”
- 欢迎界面:点击“下一步”进入欢迎界面
- 接受许可协议:阅读许可协议,选择“我接受许可协议”,点击“下一步”
- 选择安装路径:默认安装路径为“C:\Program Files (x86)\Dev-Cpp”,建议保持默认,点击“下一步”
- 选择组件:保持默认的全选状态,包括“Dev-C++”、“MinGW GCC编译器”等,点击“下一步”
- 选择开始菜单文件夹:保持默认,点击“下一步”
- 开始安装:点击“安装”按钮,等待安装完成
- 完成安装:安装完成后,勾选“运行Dev-C++”,点击“完成”启动Dev-C++
2. Visual Studio详细安装步骤
- 下载安装程序:访问Visual Studio官网,点击“下载Visual Studio”按钮,选择“Community”版本(免费)下载
- 运行安装程序:找到下载的安装程序(vs_community.exe),双击运行
- 选择工作负载:在安装界面中,选择“使用C++的桌面开发”工作负载,这将安装C/C++开发所需的工具和库
- 可选组件:可以根据需要选择额外的组件,如“Windows 10 SDK”、“MSVC v143 - VS 2022 C++ x64/x86生成工具”等
- 安装位置:可以选择安装位置,默认安装在系统盘,建议保持默认
- 开始安装:点击“安装”按钮,等待安装完成(可能需要1-2小时)
- 启动Visual Studio:安装完成后,点击“启动”按钮,首次启动需要登录或注册Microsoft账户
- 选择开发设置:首次启动时,选择“C++”开发设置,点击“启动Visual Studio”
3. Code::Blocks详细安装步骤
- 下载安装包:访问Code::Blocks官网,在“Download”页面选择带有编译器的版本(如“codeblocks-20.03mingw-setup.exe”)
- 运行安装包:双击下载的安装包,启动安装向导
- 欢迎界面:点击“Next”进入欢迎界面
- 接受许可协议:选择“I Agree”接受许可协议,点击“Next”
- 选择组件:保持默认的全选状态,点击“Next”
- 选择安装路径:默认安装路径为“C:\Program Files\CodeBlocks”,建议保持默认,点击“Install”
- 开始安装:等待安装完成
- 完成安装:点击“Finish”完成安装,启动Code::Blocks
4. Visual Studio Code配置C语言开发环境
-
下载并安装VS Code:访问VS Code官网,下载并安装适合自己系统的版本
-
安装C/C++扩展:打开VS Code,点击左侧的扩展图标(四个方块),搜索“C/C++”,安装Microsoft官方的C/C++扩展
-
安装编译器:
- Windows:安装MinGW-W64 GCC编译器
- Linux:使用系统包管理器安装GCC(如sudo apt install gcc)
- macOS:安装Xcode Command Line Tools(xcode-select --install)
-
配置编译器路径:在VS Code中,按下Ctrl+Shift+P,输入“C/C++: Edit Configurations (UI)”,配置编译器路径
-
创建launch.json文件:用于配置调试环境,按下Ctrl+Shift+P,输入“Debug: Open launch.json”,选择“C++ (GDB/LLDB)”
-
创建tasks.json文件:用于配置编译任务,按下Ctrl+Shift+P,输入“Tasks: Configure Task”,选择“C/C++: g++.exe build active file”
1.3 编写第一个C程序
现在,让我们编写第一个C程序——“Hello, World!”。这是学习任何编程语言的传统第一个程序,它将帮助我们熟悉C语言的基本语法和开发流程。
1.3.1 C程序的基本结构
一个完整的C程序通常包含以下部分:
- 预处理命令:以
#开头,如#include用于包含头文件 - 全局声明:在所有函数之外声明的变量和函数
- 主函数:
main()函数,程序的执行入口点 - 其他函数:根据需要定义的自定义函数
1.3.2 使用Dev-C++编写Hello World程序
步骤1:创建新项目
-
打开Dev-C++
-
点击菜单栏的“文件”→“新建”→“项目”(或按Ctrl+N)
-
在弹出的“新建项目”对话框中:
- 选择“控制台应用程序”类型
- 勾选“C项目”(重要:确保选择C项目而非C++项目)
- 点击“确定”
-
在“另存为”对话框中:
- 输入项目名称,如“HelloWorld”
- 选择保存路径,建议创建一个专门的文件夹存放C语言项目
- 点击“保存”
-
在弹出的“新建源文件”对话框中,点击“是”,创建一个新的源文件
步骤2:编写代码
在Dev-C++的编辑窗口中,输入以下代码:
#include <stdio.h>
/**
* 主函数 - 程序的入口点
* @return int 返回0表示程序正常结束,非0表示异常结束
*/
int main() {
// 使用printf函数输出字符串到控制台
printf("Hello, World!\n");
// 返回0表示程序正常结束
return 0;
}
步骤3:编译运行
-
编译程序:点击工具栏的“编译”按钮(或按F9),检查代码是否有语法错误
- 如果编译成功,底部状态栏会显示“编译成功”
- 如果编译失败,会在下方的“编译日志”窗口中显示错误信息,根据错误信息修改代码
-
运行程序:编译成功后,点击工具栏的“运行”按钮(或按F10)运行程序
- 也可以直接点击“编译运行”按钮(或按F11),一次性完成编译和运行
-
查看运行结果:程序运行后,会弹出一个控制台窗口,显示“Hello, World!”
-
关闭窗口:按任意键关闭控制台窗口
1.3.3 使用Visual Studio编写Hello World程序
步骤1:创建新项目
-
打开Visual Studio
-
点击“创建新项目”
-
在“创建新项目”对话框中:
- 搜索“控制台应用”
- 选择“控制台应用”模板(C++)
- 点击“下一步”
-
在“配置新项目”对话框中:
- 输入项目名称,如“HelloWorld”
- 选择保存路径
- 点击“创建”
步骤2:编写代码
Visual Studio会自动生成一些代码,我们需要修改为纯C语言代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
步骤3:编译运行
- 点击工具栏的“本地Windows调试器”按钮(或按F5)编译运行程序
- 程序运行后,会弹出一个控制台窗口,显示“Hello, World!”和“按任意键继续...”
- 按任意键关闭窗口
1.3.4 使用VS Code编写Hello World程序
步骤1:创建项目文件夹
- 创建一个新的文件夹,如“HelloWorld”
- 用VS Code打开这个文件夹
步骤2:创建源文件
- 在VS Code中,点击左侧的“资源管理器”图标
- 点击“新建文件”按钮,创建一个名为“hello.c”的文件
步骤3:编写代码
在“hello.c”文件中输入以下代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
步骤4:编译运行
-
打开终端(View → Terminal)
-
使用gcc编译器编译代码:
gcc -o hello hello.c -
运行编译后的可执行文件:
- Windows:
./hello.exe - Linux/macOS:
./hello
- Windows:
1.3.5 代码详细解析
让我们逐行解析Hello World程序的代码:
| 代码行 | 解释 |
|---|---|
#include <stdio.h> | - #include是预处理命令,用于包含头文件 |
<stdio.h>是标准输入输出头文件,定义了printf、scanf等函数- 尖括号
<>表示从系统默认路径查找头文件 - 如果是自定义头文件,使用双引号
""| |int main()| -int是函数返回值类型,表示该函数返回一个整数 main是函数名,这是C程序的唯一入口函数名()表示函数参数列表,这里为空表示没有参数- 也可以写成
int main(int argc, char *argv[]),表示接受命令行参数 | |{| 函数体的开始标记,所有函数内的代码都必须在大括号内 | |printf("Hello, World!\n");| -printf是标准库函数,用于向控制台输出信息 "Hello, World!\n"是格式字符串,包含要输出的文本\n是转义字符,表示换行;是语句结束符,C语言中每条语句都必须以分号结束 | |return 0;| -return是返回语句,用于结束函数执行并返回值0是返回值,表示程序正常结束- 如果返回非0值,表示程序异常结束,返回值可以被操作系统获取 |
|
}| 函数体的结束标记 |
1.3.6 常见错误及解决方案
初学者在编写第一个C程序时,可能会遇到以下常见错误:
| 错误类型 | 错误信息示例 | 解决方案 |
|---|---|---|
| 忘记分号 | [Error] expected ';' before '}' token | 在语句末尾添加分号 |
| 括号不匹配 | [Error] expected '}' at end of input | 检查所有括号是否成对出现 |
| 拼写错误 | [Error] 'print' was not declared in this scope | 检查函数名是否拼写正确(应为printf) |
| 头文件错误 | [Error] stdio.h: No such file or directory | 检查头文件名是否拼写正确,或编译器路径配置是否正确 |
| 字符串引号错误 | [Error] expected expression before 'Hello' | 确保字符串使用双引号""包裹 |
| 大小写错误 | [Error] 'Main' was not declared in this scope | C语言区分大小写,main函数必须小写 |
1.4 在线编译器推荐
如果不想安装本地编译器,也可以使用在线编译器编写和运行C程序:
- 菜鸟教程在线编译器:c.runoob.com/compile/11
- Compiler Explorer:godbolt.org/
- Replit:replit.com/languages/c
章节练习:第一个C程序
- 安装Dev-C++或其他IDE,并熟悉其基本操作界面。
- 编写并运行“Hello, World!”程序,尝试修改输出内容。
- 使用命令行编译器(如GCC)编译并运行同一个程序。
- 尝试编写一个简单的C程序,输出你的姓名和年龄。
- 使用在线编译器编写并运行上述程序,比较与本地编译器的差异。
疑难解析:编写第一个C程序常见问题
Q: 为什么main函数的返回值类型是int?
A: main函数的返回值类型是int,用于向操作系统返回程序的执行结果。通常,返回值为0表示程序正常结束,非0值表示程序异常结束。操作系统可以通过这个返回值判断程序的执行状态。
Q: 为什么要包含stdio.h头文件?
A: stdio.h是标准输入输出头文件,定义了printf、scanf等函数。使用这些函数时,必须包含对应的头文件,否则编译器会不知道这些函数的存在,导致编译错误。
Q: 为什么C语言区分大小写?
A: C语言区分大小写是设计决策,这使得标识符的命名更加灵活,可以使用不同的大小写形式表示不同的标识符。例如,Main和main是两个不同的标识符。
易错部分:编写第一个C程序常见错误
- 忘记包含头文件:使用printf等标准库函数时,必须包含对应的头文件(如stdio.h)。
- 忘记分号:C语言中每条语句必须以分号结束。
- 括号不匹配:所有括号必须成对出现,包括大括号、中括号和小括号。
- 拼写错误:例如,将printf误写为print。
- 字符串引号错误:字符串必须使用双引号包裹,字符必须使用单引号包裹。
- 大小写错误:main函数必须小写,不能写成Main或MAIN。
章节趣事:Hello, World!的由来
“Hello, World!”程序起源于1978年布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版的《The C Programming Language》一书。这本书使用“Hello, World!”作为第一个C程序的示例,从此成为学习任何编程语言的传统第一个程序。
这个简单的程序虽然只有几行代码,但它包含了C程序的基本结构:预处理命令、函数定义、语句和返回语句,是学习C语言的良好起点。