☰
从零开始学C语言:用Dev-C++搭建编程环境与解决常见坑
2026/10/4 10:25:31 网站建设 项目流程

1. 为什么要从C语言开始,以及为什么选Dev-C++

1.1 C语言在大学课程里的真实位置

很多大一新生刚进校就会遇到C语言这门课,但说实话,不少人对它的态度是矛盾的。一方面它被称作“编程基础中的基础”,另一方面又是很多人的第一门编程课,第一节课就被指针、内存这些概念搞得晕头转向。这里我想先把C语言的位置梳理清楚,因为这决定了你后面该怎么学、学多深。

C语言是现代几乎所有主流编程语言的“祖辈”之一。你现在手机上跑的安卓系统,底层就是Linux内核,而Linux内核绝大部分是用C写的;Windows的核心部分同样离不开C;数据库、浏览器、编译器这些底层软件,C语言几乎无处不在。你在大学阶段学C语言,并不是为了将来天天用C去写业务系统,而是通过它理解计算机的本质逻辑——内存怎么分配、数据怎么存储、函数怎么调用、程序怎么编译运行。这些底层机制,学Java、Python、JavaScript的时候不会直接暴露给你,但理解了之后,你在学任何其他语言时都会轻松很多。

更实际的一点是,很多高校的计算机、电子、通信类专业,C语言是必修课,学分占比不低,而且它往往是后续课程(数据结构、操作系统、嵌入式)的前置基础。C学不好,后面会很痛苦,这不是夸张。

1.2 选Dev-C++而不是VS Code或Visual Studio的理由

现在网上一搜C语言环境搭建,推荐五花八门:Visual Studio太重、VS Code要装一堆插件、Clion要付费、Xcode只支持macOS。对于大学生尤其是一年级新生来说,我说句实在话:别在最开始的环境搭建上耗费太多精力,你的精力应该留给语法和逻辑本身。

Dev-C++ 5.11(Orwell Dev-C++)是一个老牌的Windows平台C/C++集成开发环境,它经过MinGW编译器封装,做到了“装完即用”,不需要你单独配置编译器、调试器、环境变量。双击打开就能写代码、编译、运行、调试。虽然它的界面停留在上个时代的审美,但功能对初学C语言来说完全够用,而且全国大量高校机房、教材配套软件用的就是它,兼容性经过多年验证。

这里说明一下,我推荐Dev-C++的前提是“你正在系统地学习C语言基础,需要快速把环境跑通”。如果你以后做大型项目、开发实际软件,可以再往Visual Studio或VS Code迁移。每个工具都有自己的定位,Dev-C++的定位就是“教学和入门”。别听人说什么“用Dev-C++会被嘲笑”,工具是拿来用的,不是拿来攀比的,能把代码跑起来、把概念学明白,就是好工具。

2. 环境搭建的关键前提:先搞懂C语言代码的“出生过程”

2.1 源文件、编译、链接的关系

在动手安装之前,我建议你先理解一个基本概念:你用编辑器写出来的代码文件(后缀是.c的文件),计算机并不能直接执行。计算机的CPU只认识由0和1组成的机器指令,所以你的代码要经过一个“翻译”过程,这个翻译过程包含“编译”和“链接”两步。

打个比方:你写代码就像用中文写了一篇文章,而CPU只懂英文(机器语言),编译器就是那个把中文翻译成英文的翻译官。但文章里可能引用了别的书上的段落(外部函数、库函数),比如printf这个函数就不是你自己写的,它躺在C语言的标准库里,链接器负责把你要用的这些现成段落拼接进最终文件里。编译是把单个源文件从C语言“翻译”成机器指令,链接是把多个源文件和库合并成一个可执行的程序。

Dev-C++之所以适合入门,就是因为它把这编译和链接两个过程整合得非常好,你在界面里点一下“编译运行”,它自动完成全部步骤,不需要你手动敲命令行。但从知识角度,你心里得有这个概念,不然以后遇到“编译通过但链接失败”之类的报错会摸不着头脑。

2.2 C语言标准的选择:C99还是C11

Dev-C++ 5.11自带的编译器版本比较老(GCC 4.9.2),默认支持的C语言标准是C98/C99。不同教材和考试对C语言标准的关注度不同,有的学校OJ(在线判题系统)用的标准也各不相同。这里有个实用建议:在Dev-C++里,把编译器选项设置为“让GCC遵循C99标准”通常是最稳妥的选择。

为什么不是C11?因为C11标准里有些新特性,GCC 4.9.2基本也支持,但在Dev-C++默认配置下,有些特性需要额外加编译选项才能开启。对于初学者来说,C99已经足够覆盖你的所有课程内容。你不太可能在大一阶段用到那些C11新增的复杂特性。记住:先掌握基础,再考虑新标准。

3. 保姆级安装步骤:从下载到第一个程序运行

3.1 下载安装包的正确姿势

Dev-C++ 5.11的安装包可以从两个地方获取:一是SourceForge上的Orwell Dev-C++项目页,二是国内一些高校软件站或网盘。为了安全和稳定,我建议优先从SourceForge下载,虽然访问速度可能慢一些,但至少能保证文件未经篡改。

下载时注意版本号:Dev-C++有很多分支版本,有的是Bloodshed Dev-C++(老版本,已停止维护),有的是Orwell Dev-C++(目前Windows平台使用最广的版本),有的叫Embarcadero Dev-C++(较新的分支,界面更现代,内置编译器更新)。我这里讲解的是Orwell Dev-C++ 5.11,也是目前大学教材配套最常用的版本。

下载完成后,你会得到一个类似于Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe的安装文件。文件名里的TDM-GCC表示它集成了TDM-GCC编译器套件,4.9.2是GCC的版本号。

3.2 安装过程中的三个容易忽略的细节

双击安装包后,一路Next,但我建议你注意三个细节:

第一,安装目录不要带空格和中文。默认安装路径是C:\Program Files (x86)\Dev-Cpp,如果你嫌这个路径太长,可以改成C:\Dev-Cpp或者D:\Dev-Cpp。为什么不能带中文?因为一些编译器在解析路径时对中文支持不好,虽然Dev-C++在大多数情况下能兼容中文路径,但偶尔会出一些莫名其妙的错误,真的排查起来很浪费时间。既然能避免,就直接在源头避免。

第二,选择“MinGW GCC 编译器”组件,不要选其他编译器选项。安装过程中会让你勾选组件,默认已经勾选了编译器,保持默认即可。

第三,首次启动时,会让你选择语言和界面风格。语言直接选“简体中文”,虽然Dev-C++的汉化包不算完美,但对初学者来说,中文界面总比英文界面更容易上手。值得注意的是,选择语言之后还能再改,所以不用太纠结,后面菜单里有“Language”设置可以随时切换。

3.3 配置Dev-C++的编译器选项

安装完成后首次打开,你会看到一个干净但略简陋的主界面。在开始写代码之前,建议先花一分钟做一个关键配置。点击顶部菜单“工具” -> “编译器选项”,在弹出的窗口里做两件事:

  1. 在“编译器”标签页的“编译器参数”栏中,确认“在编译时加入以下命令”文本框里含有-std=c99,如果没有,就手动加一行。有的版本默认没有这个参数,有的版本默认参数是-std=c11。我建议统一设置成-std=c99,因为目前大多数高校OJ(在线判题系统)和教材示例在C99标准下运行最稳定。

  2. 切换到“程序设置”标签页,把“C++编译器”和“C编译器”下方的复选框都勾选上“使用静态链接”相关的选项?实际上这一条在5.11版本里不是必须的。这里我说清楚:只需确认编译器的C++和C语言路径指向了MinGW目录下的相应编译器即可,默认已经配置好,不用改动。

这个配置的作用是让编译器的行为更符合你上课教材的语法规范。如果不设置,默认情况也能跑,但万一你用了C99中新增的一些语法特性(比如//注释在C99中是标准,在C89中不支持等),就可能遇到不必要的报错。

注意:设置完编译器选项后,点击确定保存。以后如果你换了新电脑重新安装,记得做同样的一次设置。

3.4 建立你的第一个C语言源文件

配置完成后,正式开始写代码。点击左上角的“文件” -> “新建” -> “源文件”,或者直接按快捷键Ctrl+N,就会新建一个空白文件。这时候千万别急着直接点编译运行,因为如果你新建的是未命名的文件,Dev-C++默认会把它当成一个无扩展名的临时文件,编译时可能会报错。

正确做法是:按下Ctrl+S先保存文件,文件名取hello.c,扩展名一定要是.c,保存到你专门建的C语言练习目录下,比如D:\C_Learning。注意,文件名可以用英文,但尽量别用中文名,虽然现代Windows和Dev-C++对中文文件名支持已经不错,但在一些老版本上可能会出现编码问题。

然后把下面的代码逐字敲进去。我强烈建议你手动敲,而不是复制粘贴,因为初学编程阶段的“打字手感”很重要,C语言的括号、分号、缩进节奏就是在敲代码的过程中逐步建立起来的:

#include <stdio.h> int main() { printf("Hello, C Language!\n"); return 0; }

这里解释一下每行代码是干什么的:#include <stdio.h>是引入标准输入输出库,stdio即standard input output,没有这一行,后面的printf函数就无法使用;int main()是程序入口,整个程序从这里开始执行;printf负责在屏幕上打印文字;return 0;表示程序正常结束,返回0给操作系统。

输入完代码后,点击顶部工具栏上的“编译运行”按钮(图标是一个小齿轮带一个绿色向右的箭头),或者按F11键。稍等片刻,你会看到一个黑色的控制台窗口弹出,里面写着Hello, C Language!,然后窗口停留一下(Dev-C++默认会在程序结束后暂停等待任意键),按任意键后窗口关闭。到这里,恭喜你,你的第一个C语言程序成功跑起来了。

3.5 关于Dev-C++的调试功能

学C语言时,Debug(调试)是必须掌握的一项技能。Dev-C++提供了基本的调试功能,虽然不如Visual Studio那么强大,但应对课程作业和初学阶段完全够用。

调试的流程是这样的:先把光标定位在你想暂停的那一行代码上,按F4设置断点(该行左侧会出现一个红色圆点),然后点击工具栏上的“调试”按钮(图标是一个带小虫子的方框,或者在“运行”菜单里选“调试”),程序会从开始运行到断点处暂停。此时你可以使用“下一步”(快捷键F7)单步执行代码,逐行观察程序走向,同时可以在界面下方的调试面板看到变量的值变化情况。

这个功能非常建议在初学阶段就养成使用的习惯,尤其是遇到程序输出结果和预期不符的时候,单步调试几次,很多问题自己就找到原因了。很多同学遇到程序跑不出结果,第一反应是“我代码是不是写错了”,但光看代码看不出来,这时候调试器就是你的第二双眼睛。

4. 用stdio.h和limits.h解决一个实际问题:5×5鞍点问题

环境搭好之后,总得用它做点有意义的事。我选一个经典的C语言练习题来演示完整过程——“计算5×5矩阵的鞍点”。这个题在很多教材和学校的OJ题目中出现过,它考核的知识点非常典型:二维数组、嵌套循环、条件判断。同时我会把stdio.h和limits.h用上,顺便讲清楚这两个头文件的价值。

4.1 什么是鞍点,以及怎么找到它

鞍点的定义很简单:在一个矩阵中,某个位置上的数“在所在行中是最大值,同时在所在列中是最小值”,这个位置就叫鞍点。举个例子,如果存在这样一个位置(i, j),它大于等于它所在行的所有元素,同时小于等于它所在列的所有元素,那它就是鞍点。注意,“大于等于”而不是“大于”,是因为矩阵元素可能重复,题目有时要求严格大于或小于,有时允许等于,做题前先确认题目描述。

一个5×5的矩阵可能有多个鞍点,也可能一个都没有。我们要做的,是输入一个5×5的二维数组,遍历每个位置,找出所有满足条件的鞍点并输出,如果不存在则输出“not found”之类的提示信息。

4.2 代码实现与思路拆解

这里给出一个完整的参考实现,重点在于逻辑清晰,而不是追求代码花哨:

#include <stdio.h> #define N 5 int main() { int a[N][N]; int i, j, k; int found = 0; // 输入5×5矩阵 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { scanf("%d", &a[i][j]); } } // 遍历每个元素,判断是否为鞍点 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { int isRowMax = 1; int isColMin = 1; // 检查第i行中,有没有比a[i][j]更大的数 for (k = 0; k < N; k++) { if (a[i][k] > a[i][j]) { isRowMax = 0; break; } } // 检查第j列中,有没有比a[i][j]更小的数 for (k = 0; k < N; k++) { if (a[k][j] < a[i][j]) { isColMin = 0; break; } } if (isRowMax && isColMin) { printf("鞍点位置: (%d, %d), 值: %d\n", i, j, a[i][j]); found = 1; } } } if (!found) { printf("未找到鞍点\n"); } return 0; }

这段代码的逻辑分三层,对应三层循环。外层i和j的作用是选中当前要判断的位置;中层的两个循环分别检查这一行里有没有比它大的、这一列里有没有比它小的;isRowMax和isColMin两个标志变量记录检查结果。全部检查完后,如果条件同时成立,就找到了一个鞍点。

为什么用两个标志变量而不是直接在循环里判断并输出?因为你得等这一行一列全部检查完才能确认结果,如果在循环中间发现有一个元素比它大就直接下结论,会漏掉下面可能存在的有效鞍点。这种“先假设成立,遍历验证,发现反例就推翻”的思路,在编程中非常常用,一定要掌握。

4.3 用limits.h来理解C语言的数据范围

在上面这段代码中,其实没有直接用limits.h,但它和很多C语言题目都有关联。limits.h这个头文件定义了各种数据类型的大小范围,比如INT_MAX(int类型的最大值,通常是2147483647)、INT_MIN(int类型的最小值,通常是-2147483648)。在处理一些需要“找一个集合的最小值”的问题时,我们常常会把初始值设为INT_MAX,这种做法非常常见。

看一下用limits.h解决问题的一个经典场景。假如你要算出5×5矩阵里每一行的最大值,你可以在遍历之前把当前最大值初始化为INT_MIN,然后逐个元素比较。如果没有INT_MIN,你可能把初值设为0,但万一矩阵里全是负数,你的程序结果就会错误,因为初始值0比所有负数都大。

#include <stdio.h> #include <limits.h> int main() { int a[5][5] = {...}; int rowMax[5]; int i, j; for (i = 0; i < 5; i++) { rowMax[i] = INT_MIN; for (j = 0; j < 5; j++) { if (a[i][j] > rowMax[i]) { rowMax[i] = a[i][j]; } } } return 0; }

这个细节虽然简单,却能体现一个程序员思考问题的周全程度。初学C语言时,大家经常忽略数据范围的边界问题,但恰恰是这些边界条件,导致程序在处理极端输入时崩溃或给出错误答案。做题时养成使用limits.h里面常量的习惯,是提升代码质量的一个重要信号。

5. 初学者常见的几个“环境类”问题排查实录

5.1 编译通过但运行时窗口闪退

这是所有初学者最常遇到的问题:编译没问题,也没有报错,但运行窗口一闪而过,你根本来不及看清程序输出。解决思路很简单——让程序在结束前停下来等待你的按键。

在Dev-C++里,如果你的代码中main函数最后加的是return 0;,那么程序会直接退出。解决办法有两种:

  1. 在代码最后加上system("pause");。这条语句的作用是调用系统的暂停命令,程序执行到这里会停住,屏幕显示“请按任意键继续”。注意使用前需要加上#include <stdlib.h>头文件。system("pause")虽然方便,但严格意义上它不是标准C语言的内容,只在Windows环境有效。

  2. 在Dev-C++的菜单“工具”->“编译器选项”->“程序设置”里,勾选“运行程序时暂停”相关的选项,或者点击运行按钮的下拉箭头,选择“运行(结束后暂停)”(不同语言版本表述略有不同)。设置完成后,Dev-C++会在程序运行结束后自动暂停。

我更推荐第一种方法,因为你要参加课程考试或者OJ在线判题的时候,平台通常不需要你加system("pause"),但在本地练习时可以加上方便查看输出。

注意:如果以后你在Linux环境或在线判题系统中提交代码,请务必把system("pause")删掉,否则可能导致程序表现异常,因为这命令在非Windows环境下不存在。

5.2 scanf输入崩溃或无法接收输入

有时候程序编译没问题,但一到输入数字就卡住,或者输入之后程序直接崩了。这大概率是因为scanf中忘记加“取地址符”&了。初学者最容易在这上面踩坑。

scanf("%d", a);是不对的,它漏了&,你应该写scanf("%d", &a);。为什么必须有&?因为scanf的功能是“把从键盘读入的值存到你指定的内存地址中”,它需要的是变量在内存中的地址,而不是变量的值本身。给你变量a的地址,就需要用到取地址运算符&,得到“a在哪里”的信息,然后scanf把输入的数据写到那个位置上。

如果漏了&,程序会尝试把输入的值写到a的内容所指向的内存地址,这在绝大多数情况下是一个非法内存地址,轻则输入失败,重则直接触发段错误导致程序崩溃。这类错误在初学阶段极其常见,而且编译器不一定能检查出来,因为语法层面没有错误,只是语义错误。

5.3 中文输出乱码

你在Dev-C++里写了printf("你好");,运行后控制台显示乱码,这也是经典问题。原因在于Dev-C++默认使用的编码格式和Windows控制台显示时使用的编码不一致。代码文件保存时用的是UTF-8或者GB2312,而控制台可能用的是GBK,两者对汉字的解码方式不同,自然就会变成火星文。

解决办法有三种,任选其一对你有用就行:

  1. 在代码文件顶部的第一行加上#include <windows.h>,然后在main函数开头调用SetConsoleOutputCP(65001);,这会把控制台代码页切换为UTF-8编码,适用于代码文件保存为UTF-8的情况。

  2. 不在代码里做任何处理,直接在代码文件里不写中文。这也是为什么很多教材里的示例代码全是英文,不是歧视中文,而是避免编码问题的麻烦。

  3. 把代码文件用GBK编码保存。具体的操作是:在Dev-C++的“文件”菜单中,选择“另存为”,然后在底部的“编码”下拉框中,选择“简体中文(GB2312)”。保存后,程序输出的中文一般就能正常显示了。

考虑到初学阶段,我的建议是:练习代码尽量用英文输出。不是让你降低追求,而是将有限的精力集中在核心语法上,中文输出编码问题不值得花太多时间纠结。等你以后换成VS Code或者Visual Studio,编码问题自然就少了。

5.4 编译报错“undefined reference to `imp_...'”或无法链接库

这类链接错误偶尔发生,常见原因是在代码中使用了某些非标准函数或图形库函数,但没有在编译器选项中添加对应的库依赖。比如你尝试用GetAsyncKeyState等Windows API函数,就需要链接user32库。不过这是比较进阶的问题,大一课程设计可能还碰不到。真遇到了,先确认你的代码中是否使用了不在标准库范围内的函数;如果是,查一下该函数属于哪个库,然后在Dev-C++的“项目”->“项目属性”->“参数”->“链接器”中添加对应的库文件。

5.5 Dev-C++无法打开或保存文件

有时你在机房电脑上使用Dev-C++,发现文件保存到U盘或者网络驱动器时卡住,或者打开文件时提示路径错误。这不一定是软件问题,更可能是权限问题。解决方案:把开发目录设置在本地磁盘,比如C:\Users\你的用户名\Documents\C_Projects或者D:\C_Projects,避免直接使用网络磁盘或受控目录。涉及操作系统权限的事情,没必要硬碰硬地排查,绕开即可。

6. 十二个实操心得,让你的C语言学习之路更顺畅

6.1 关于编译报错的心态和技术

第一次看到编译报错时,心态很容易崩。这里告诉你一个真实的数据:C语言编译器给出的错误信息,尤其是英文的,初学者往往看不懂。比如最常见的一条expected ';' before '}' token,翻译过来是“在}之前期待一个分号”,这意味着你的某条语句结尾漏了分号,或者是大括号配错对。

遇到编译错误,别慌,记住两条原则:

第一,编译器只会告诉你它第一次在哪一步卡住的,不一定是全部错误。修复一个错误后重新编译,可能后面又冒出一堆新错误,这是正常的。很多初学者希望一次性把所有错误都修完,但实际上逐次修复才是常态。

第二,错误信息虽然啰嗦,但关键信息在冒号后面的具体描述里。看的时候关注文件名、行号和错误类型这几个关键字段。Dev-C++的“编译日志”面板下方会显示错误列表,双击错误条目可以自动跳转到对应的代码行,这个功能非常方便,建议用它定位问题。

6.2 辅助工具和学习方法

Dev-C++虽然是编辑器,但写代码时我也会用一些辅助工具。这里说两个比较实用的:一是“代码自动补全”功能在Dev-C++中没那么发达,但可以通过“编辑”->“代码补全”开启一些基本提示;二是当代码量变大时,学会使用Dev-C++的“工程”(Project)功能。新建工程而不是新建单个源文件,可以更规范地组织多文件程序,比如课程设计需要分多个.c和.h文件时,工程功能就派上用场了。

关于学习方法,一个比较经典的建议是“程序调试+笔记记录”。遇到不会的问题,在代码里加上注释记录当时的思考过程;在笔记里写上错误信息和解决方案,以后遇到同类问题可以快速翻找。学习编程半年以后,你会惊讶地发现,你踩过的坑有一半以上都是以前踩过的,你的笔记就是你最好的老师。

6.3 从Dev-C++到其他IDE的迁移准备

学了半个学期、对C语言有基本掌控感之后,可以考虑尝试更现代的开发工具。这里说下我的建议:至少学3到4周之后再迁移,因为你需要先熟悉“编写代码 -> 编译 -> 运行 -> 调试”的完整流程,形成肌肉记忆后再换工具才不会有认知负担。

如果真要换,首选VS Code(Visual Studio Code)加C/C++扩展,配合MinGW-w64编译器。切换的过程无非就是:安装VS Code、安装扩展、配置编译器路径、配置launch.json和tasks.json。但说实话,大一阶段完全没必要急着玩这些,用Dev-C++踏踏实实把课程内容学好、把题目做掉,比环境折腾更有性价比。工具是为学习服务的,不是反过来。

7. 最后再说一点我的经验

把这套环境搭好、把第一个程序跑通、把鞍点问题完整思考一遍之后,你会发现C语言入门最难的部分,其实不是语法本身,而是“从0到1”的这段路程——安装一个能运行代码的环境,理解编译流程,看懂第一份错误信息。这些跨过去之后,后面的路会顺很多。

我个人在实际教学和写代码的过程中,一直强调一个观点:初学者不要过度依赖“自动补全”。用Dev-C++这种不智能的IDE写代码,反而是一种锻炼,因为你必须自己把每个字符敲出来,每一条语句都过一遍脑子,这对记忆语法和养成严谨习惯很有帮助。等你以后用VS Code或JetBrains那些智能提示满满的IDE,你会发现自己的基础很扎实,不容易写出“看着对但跑不起来”的代码。

最后分享一个小技巧:每次写完一个程序,先别着急提交或者急着看结果,把代码里你不太确定的每一处都标个记号,然后挨个试一试。比如这个条件能不能反着写?这个循环的边界改成小于等于会怎样?把例子改一改,运行一下,观察输出变化。这种“刻意试验”的学习方式,比重复做十道类似的题目都更有效。C语言不是一个看会的学科,是一个试会的学科。动手,永远比焦虑有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询