C语言基础十四课 第一课

6 阅读21分钟

第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. 主要编译器详细比较
编译器开发者开源情况支持的标准编译速度优化能力错误信息适用平台主要优势
GCCGNU社区开源免费C89/C90/C99/C11/C17/C23中等强大较详细Windows、Linux、macOS功能全面,支持多种架构,广泛应用
ClangLLVM项目开源免费C89/C90/C99/C11/C17/C23友好、详细Windows、Linux、macOS编译速度快,错误信息清晰,模块化设计
MSVCMicrosoft闭源商业C89/C90/C99(部分)/C11(部分)/C17(部分)详细,与VS集成Windows与Windows系统兼容性好,调试工具强大
Intel C++ CompilerIntel闭源商业C89/C90/C99/C11/C17中等极强详细Windows、Linux、macOS针对Intel架构优化,性能优异
TCCFabrice Bellard开源免费C89/C90/C99(部分)极快简单Windows、Linux、macOS编译速度极快,适合快速原型开发
2. 编译器版本与C标准支持

不同编译器版本对C标准的支持程度不同,以下是主要编译器对C标准的支持情况:

编译器C89/C90C99C11C17C23
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
优点智能功能强大,用户体验好,跨平台
缺点商业软件,需要付费,资源占用较高

下载地址:www.jetbrains.com/clion/

2.5 Visual Studio Code

Visual Studio Code(VS Code)是微软推出的轻量级跨平台代码编辑器,可通过插件扩展为IDE。

特点详细说明
体积约100MB,非常轻量
界面现代化,简洁美观
编译器需要单独安装编译器(如MinGW GCC、Clang)
功能通过插件扩展,可支持代码编辑、智能提示、调试、版本控制等
支持标准取决于安装的编译器和插件
优点轻量级,启动快,插件丰富,跨平台
缺点需要手动配置编译器和插件,对初学者不够友好

下载地址:code.visualstudio.com/

章节练习:开发环境选择

  1. 根据你的操作系统,选择一个适合的C语言编译器,并说明选择理由。
  2. 调查你选择的编译器对C23标准的支持情况。
  3. 选择一个适合你的IDE或代码编辑器,并说明选择理由。

1.2.3 详细安装步骤

1. Dev-C++详细安装步骤
  1. 下载安装包:访问Dev-C++官网,点击“Download”按钮下载最新版本的安装包
  2. 运行安装包:找到下载的安装包(通常为exe文件),双击运行
  3. 选择语言:在弹出的安装向导中,选择“中文简体”,点击“OK”
  4. 欢迎界面:点击“下一步”进入欢迎界面
  5. 接受许可协议:阅读许可协议,选择“我接受许可协议”,点击“下一步”
  6. 选择安装路径:默认安装路径为“C:\Program Files (x86)\Dev-Cpp”,建议保持默认,点击“下一步”
  7. 选择组件:保持默认的全选状态,包括“Dev-C++”、“MinGW GCC编译器”等,点击“下一步”
  8. 选择开始菜单文件夹:保持默认,点击“下一步”
  9. 开始安装:点击“安装”按钮,等待安装完成
  10. 完成安装:安装完成后,勾选“运行Dev-C++”,点击“完成”启动Dev-C++
2. Visual Studio详细安装步骤
  1. 下载安装程序:访问Visual Studio官网,点击“下载Visual Studio”按钮,选择“Community”版本(免费)下载
  2. 运行安装程序:找到下载的安装程序(vs_community.exe),双击运行
  3. 选择工作负载:在安装界面中,选择“使用C++的桌面开发”工作负载,这将安装C/C++开发所需的工具和库
  4. 可选组件:可以根据需要选择额外的组件,如“Windows 10 SDK”、“MSVC v143 - VS 2022 C++ x64/x86生成工具”等
  5. 安装位置:可以选择安装位置,默认安装在系统盘,建议保持默认
  6. 开始安装:点击“安装”按钮,等待安装完成(可能需要1-2小时)
  7. 启动Visual Studio:安装完成后,点击“启动”按钮,首次启动需要登录或注册Microsoft账户
  8. 选择开发设置:首次启动时,选择“C++”开发设置,点击“启动Visual Studio”
3. Code::Blocks详细安装步骤
  1. 下载安装包:访问Code::Blocks官网,在“Download”页面选择带有编译器的版本(如“codeblocks-20.03mingw-setup.exe”)
  2. 运行安装包:双击下载的安装包,启动安装向导
  3. 欢迎界面:点击“Next”进入欢迎界面
  4. 接受许可协议:选择“I Agree”接受许可协议,点击“Next”
  5. 选择组件:保持默认的全选状态,点击“Next”
  6. 选择安装路径:默认安装路径为“C:\Program Files\CodeBlocks”,建议保持默认,点击“Install”
  7. 开始安装:等待安装完成
  8. 完成安装:点击“Finish”完成安装,启动Code::Blocks
4. Visual Studio Code配置C语言开发环境
  1. 下载并安装VS Code:访问VS Code官网,下载并安装适合自己系统的版本

  2. 安装C/C++扩展:打开VS Code,点击左侧的扩展图标(四个方块),搜索“C/C++”,安装Microsoft官方的C/C++扩展

  3. 安装编译器

    • Windows:安装MinGW-W64 GCC编译器
    • Linux:使用系统包管理器安装GCC(如sudo apt install gcc)
    • macOS:安装Xcode Command Line Tools(xcode-select --install)
  4. 配置编译器路径:在VS Code中,按下Ctrl+Shift+P,输入“C/C++: Edit Configurations (UI)”,配置编译器路径

  5. 创建launch.json文件:用于配置调试环境,按下Ctrl+Shift+P,输入“Debug: Open launch.json”,选择“C++ (GDB/LLDB)”

  6. 创建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:创建新项目
  1. 打开Dev-C++

  2. 点击菜单栏的“文件”→“新建”→“项目”(或按Ctrl+N)

  3. 在弹出的“新建项目”对话框中:

    • 选择“控制台应用程序”类型
    • 勾选“C项目”(重要:确保选择C项目而非C++项目)
    • 点击“确定”
  4. 在“另存为”对话框中:

    • 输入项目名称,如“HelloWorld”
    • 选择保存路径,建议创建一个专门的文件夹存放C语言项目
    • 点击“保存”
  5. 在弹出的“新建源文件”对话框中,点击“是”,创建一个新的源文件

步骤2:编写代码

在Dev-C++的编辑窗口中,输入以下代码:

#include <stdio.h>

/**
 * 主函数 - 程序的入口点
 * @return int 返回0表示程序正常结束,非0表示异常结束
 */
int main() {
    // 使用printf函数输出字符串到控制台
    printf("Hello, World!\n");
    
    // 返回0表示程序正常结束
    return 0;
}
步骤3:编译运行
  1. 编译程序:点击工具栏的“编译”按钮(或按F9),检查代码是否有语法错误

    • 如果编译成功,底部状态栏会显示“编译成功”
    • 如果编译失败,会在下方的“编译日志”窗口中显示错误信息,根据错误信息修改代码
  2. 运行程序:编译成功后,点击工具栏的“运行”按钮(或按F10)运行程序

    • 也可以直接点击“编译运行”按钮(或按F11),一次性完成编译和运行
  3. 查看运行结果:程序运行后,会弹出一个控制台窗口,显示“Hello, World!”

  4. 关闭窗口:按任意键关闭控制台窗口

1.3.3 使用Visual Studio编写Hello World程序

步骤1:创建新项目
  1. 打开Visual Studio

  2. 点击“创建新项目”

  3. 在“创建新项目”对话框中:

    • 搜索“控制台应用”
    • 选择“控制台应用”模板(C++)
    • 点击“下一步”
  4. 在“配置新项目”对话框中:

    • 输入项目名称,如“HelloWorld”
    • 选择保存路径
    • 点击“创建”
步骤2:编写代码

Visual Studio会自动生成一些代码,我们需要修改为纯C语言代码:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
步骤3:编译运行
  1. 点击工具栏的“本地Windows调试器”按钮(或按F5)编译运行程序
  2. 程序运行后,会弹出一个控制台窗口,显示“Hello, World!”和“按任意键继续...”
  3. 按任意键关闭窗口

1.3.4 使用VS Code编写Hello World程序

步骤1:创建项目文件夹
  1. 创建一个新的文件夹,如“HelloWorld”
  2. 用VS Code打开这个文件夹
步骤2:创建源文件
  1. 在VS Code中,点击左侧的“资源管理器”图标
  2. 点击“新建文件”按钮,创建一个名为“hello.c”的文件
步骤3:编写代码

在“hello.c”文件中输入以下代码:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
步骤4:编译运行
  1. 打开终端(View → Terminal)

  2. 使用gcc编译器编译代码:

    gcc -o hello hello.c
    
  3. 运行编译后的可执行文件:

    • Windows:./hello.exe
    • Linux/macOS:./hello

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 scopeC语言区分大小写,main函数必须小写

1.4 在线编译器推荐

如果不想安装本地编译器,也可以使用在线编译器编写和运行C程序:

章节练习:第一个C程序

  1. 安装Dev-C++或其他IDE,并熟悉其基本操作界面。
  2. 编写并运行“Hello, World!”程序,尝试修改输出内容。
  3. 使用命令行编译器(如GCC)编译并运行同一个程序。
  4. 尝试编写一个简单的C程序,输出你的姓名和年龄。
  5. 使用在线编译器编写并运行上述程序,比较与本地编译器的差异。

疑难解析:编写第一个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语言的良好起点。