ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从零开始学C语言:用Dev-C++搭建编程环境与解决常见坑

从零开始学C语言:用Dev-C++搭建编程环境与解决常见坑 1. 为什么要从C语言开始以及为什么选Dev-C1.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.11Orwell 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还是C11Dev-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的编译器选项安装完成后首次打开你会看到一个干净但略简陋的主界面。在开始写代码之前建议先花一分钟做一个关键配置。点击顶部菜单“工具” - “编译器选项”在弹出的窗口里做两件事在“编译器”标签页的“编译器参数”栏中确认“在编译时加入以下命令”文本框里含有-stdc99如果没有就手动加一行。有的版本默认没有这个参数有的版本默认参数是-stdc11。我建议统一设置成-stdc99因为目前大多数高校OJ在线判题系统和教材示例在C99标准下运行最稳定。切换到“程序设置”标签页把“C编译器”和“C编译器”下方的复选框都勾选上“使用静态链接”相关的选项实际上这一条在5.11版本里不是必须的。这里我说清楚只需确认编译器的C和C语言路径指向了MinGW目录下的相应编译器即可默认已经配置好不用改动。这个配置的作用是让编译器的行为更符合你上课教材的语法规范。如果不设置默认情况也能跑但万一你用了C99中新增的一些语法特性比如//注释在C99中是标准在C89中不支持等就可能遇到不必要的报错。注意设置完编译器选项后点击确定保存。以后如果你换了新电脑重新安装记得做同样的一次设置。3.4 建立你的第一个C语言源文件配置完成后正式开始写代码。点击左上角的“文件” - “新建” - “源文件”或者直接按快捷键CtrlN就会新建一个空白文件。这时候千万别急着直接点编译运行因为如果你新建的是未命名的文件Dev-C默认会把它当成一个无扩展名的临时文件编译时可能会报错。正确做法是按下CtrlS先保存文件文件名取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_MAXint类型的最大值通常是2147483647、INT_MINint类型的最小值通常是-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;那么程序会直接退出。解决办法有两种在代码最后加上system(pause);。这条语句的作用是调用系统的暂停命令程序执行到这里会停住屏幕显示“请按任意键继续”。注意使用前需要加上#include stdlib.h头文件。system(pause)虽然方便但严格意义上它不是标准C语言的内容只在Windows环境有效。在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两者对汉字的解码方式不同自然就会变成火星文。解决办法有三种任选其一对你有用就行在代码文件顶部的第一行加上#include windows.h然后在main函数开头调用SetConsoleOutputCP(65001);这会把控制台代码页切换为UTF-8编码适用于代码文件保存为UTF-8的情况。不在代码里做任何处理直接在代码文件里不写中文。这也是为什么很多教材里的示例代码全是英文不是歧视中文而是避免编码问题的麻烦。把代码文件用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 CodeVisual 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语言不是一个看会的学科是一个试会的学科。动手永远比焦虑有用。
返回列表