)
很多大一新生第一次上C语言课老师丢下一句回去装个Visual Studio然后你就对着官网一脸茫然。下载倒是简单装完发现新建项目全是C#、ASP.NET死活找不到C语言的入口。好不容易照着视频建好了项目写完代码一运行窗口啪地闪一下就没了或者直接弹出一堆看不懂的红色报错。这篇文章就是来解决这些破事的我会把从下载安装、组件勾选到新建项目、写完第一个C程序的全流程走一遍顺便把初学者最容易踩的坑和后续的学习路线也讲清楚给零基础的同学一条能照着走完的路。1. 为什么我建议你用VS2022学C语言而不是其他工具1.1 VS2022对新手友好的几个点Visual Studio 2022下面统一叫VS2022是微软出的一套集成开发环境集成开发环境的意思是编译器、代码编辑器、调试器、项目管理这些东西全都打包在一个软件里了。对C语言初学者来说它最值得说的优点是调试功能极其强大你可以在代码里任何一行打断点让程序停下来然后一行一行地看变量是怎么变化的。指针学不懂、数组越界查不出来很多时候靠的就是这个逐步调试功能。适合新手的第二点是VS2022对C语言语法检查非常严格标记错误很细心哪一行错了、大概是什么类型的错误它都会用红波浪线标出来。这里要说明写代码出错太正常了初学阶段报错信息看不懂也正常VS的报错算是所有IDE里比较容易顺着排查的了。此外VS2022的社区版对个人、学生和开源开发者是完全免费的国内大学机房也基本统一用它教材和网课截图基本都是VS界面跟着操作不容易对不上。1.2 那为什么不推荐DevC或者记事本加编译器我知道网上很多教程让人用DevC因为安装包小、打开快。但DevC已经很多年不更新了编译器内核老旧对新版C语言标准的支持很差调试能力也弱得多。还有推荐用记事本sublime或者vscode装一堆插件的方案这等于让一个刚学走路的人先去造一辆自行车。配置环境本身会劝退一大半人而且你根本分不清是代码错了还是环境配置错了。VS2022虽然安装占用空间大但它是装了就能直接好好写代码的类型省心少折腾对零基础来说时间成本反而是最低的。不过我也得说句公道话VS2022那安装包十几个GB配置一般的电脑跑起来确实会卡。如果你的电脑内存低于8GB或者硬盘实在没空间可以考虑DevC这类轻量工具过渡但只要电脑能带得动建议还是直接上VS2022后面调试指针和内存问题的时候你会感谢这个选择的。1.3 关于版本的选择问题VS2022有社区版Community、专业版Professional和企业版Enterprise三个版本。对学C语言来说下载社区版就够用了不需要破解、不需要找激活码永久免费。企业版和专业版加的那些功能主要是团队协作、测试工具之类个人写作业、考试、做小项目完全用不上。下载的时候认准Visual Studio Community 2022别在下载站随便找个一键安装包官网免费的东西没必要冒捆绑软件的风险。2. 环境安装最容易卡住新手的其实是组件勾选这一步2.1 下载与启动安装器去Visual Studio官网找到下载页面选择Community 2022版本会下载到一个几百MB的安装引导程序installer而不是完整的安装包。运行它之后才会真正开始联网下载安装文件。这一步如果网络不太好可能要等很久耐心点也可以换个时间再装。很多人在这个阶段会遇到一个问题安装界面卡在某个百分比不动。多数情况是网络波动导致的可以暂停再继续或者把杀毒软件暂时退出试一下下载失败一般是网络问题而不是电脑问题。2.2 工作负载勾选最关键的一步安装界面会让你勾选工作负载这里在使用C的桌面开发这个选项前面打勾然后点右下角的安装按钮。注意是C的桌面开发不是使用.NET的桌面开发也不是ASP.NET和Web开发。很多新手在这块会犯迷糊觉得学C语言为什么勾C你记住就行C那项里面包含MSVC编译器也就是C语言编译时会用到的核心组件勾上它才有编译C语言的能力。很多教程到这里就结束了但实际安装完之后还有一个隐藏知识点装完第一次启动时如果你是正式版而非预览版第一次用会弹出一个登录窗口。这里可以直接点跳过或者用微软账号登录都行不登录也不影响写代码保存项目等功能都能正常使用。登录只是为了多设备同步配置初学者完全可以跳过这一步。2.3 安装完第一次启动选择C开发设置第一次启动VS2022会进入一个首次配置界面让你选择开发设置。这里建议选Visual C也就是纯C开发环境。颜色主题随便选深色浅色都行。这个选择主要是影响界面布局和快捷键习惯C语言相关的快捷键基本没差别后面想改也能在工具-导入和导出设置里随时换。确认之后VS2022会启动到一个空窗口左边是工具箱中间是空白的起始页右边是解决方案资源管理器。这个布局看着复杂但平时写C语言用到的就三个区域中间写代码、顶部工具栏找本地 Windows 调试器按钮、右边看项目文件列表。其他面板暂时不用管等学到调试再看。3. 从空项目到第一个C程序完整流程3.1 新建项目为什么选空项目打开VS2022后点击创建新项目此时会看到一大堆项目模板控制台应用、Windows窗体应用、ASP.NET Core Web应用等等密密麻麻。这里的关键选择是找到空项目模板语言选择C只勾选空项目然后点下一步。项目名称建议用英文或拼音比如FirstC不要用中文名虽然VS2022对中文路径支持还行但以后做课设或者遇到某些历史库文件时中文路径偶尔会引发奇怪的问题别给自己埋雷。位置可以选默认也可以自己建个专门的代码文件夹注意整个路径尽量别带中文和空格。那为什么不选控制台应用模板VS的控制台应用模板默认生成的是一套C项目里面塞了一堆附加代码和预编译头文件配置。新手用这个模板很容易遇到stdafx.h找不到这类报错然后心态崩了。空项目是最干净的里面什么都没有所有配置从零来你能清楚地知道自己写的每一个文件、每一个步骤在干嘛对理解编译流程非常有帮助。而且空项目写出来的C代码跟你在考试、写作业的场景完全一致实操性最强。3.2 源文件把.cpp改成.c以及为什么要这样做点创建之后右侧会看到一个空的解决方案资源管理器。需要在源文件文件夹上右键选择添加-新建项。在弹出的窗口里选C文件.cpp然后在底部名称一栏把默认的源.cpp改成main.c——关键在于扩展名一定要是.c。可能有人会问为什么不是直接新建一个C文件选项VS2022的新建项对话框里确实默认找不到单独的.c文件类型最方便的办法就是新建.cpp然后把后缀改成.c。这里顺便解释一下底层逻辑VS2022的编译器会根据文件扩展名来决定用什么规则编译。.c扩展名会按C语言标准来编译.cpp扩展名则按C标准来编译。C和C是两种相近但不同的语言语法细节有差异初学阶段写的是纯C所以要把扩展名改成.c避免编译器按C标准检查代码出现一些莫名其妙的报错。其实VS的编译器也允许在.cpp后缀下编写C代码很多C语法在C里也兼容但会出现一些语法检查标准不一样的情况比如C语言里允许把void*隐式转换为别的类型指针C不行在.cpp里就可能报错。所以为了少踩坑从一开始就坚持用.c结尾养成习惯后面学C时再切换过来即可。3.3 写第一段代码Hello World的逐行拆解现在中间编辑区应该是一个空的main.c文件。照着输入这段代码注意所有的标点符号必须是英文半角括号、分号都不能用中文输入法打出来的全角字符否则编译必报错。这是新手第一个几乎必踩的坑我当年就被这个坑了一晚上。#define _CRT_SECURE_NO_WARNINGS #include stdio.h int main() { printf(Hello, World!\n); printf(我的第一个C语言程序\n); return 0; }第一行的#define _CRT_SECURE_NO_WARNINGS是VS特有的宏定义作用是关闭编译器对某些传统C库函数比如scanf、strcpy的安全警告。这是后话先写上去后面学到scanf你就知道这行的价值了。严格来说这一行不是C语言标准要求写的但没有它你在VS里用scanf这类函数会出现C4996报错编译会失败或者输出一堆警告。#include stdio.h是预处理指令意思是把标准输入输出库的头文件内容加载进来。printf函数的声明就来自这个头文件没有这句话printf会被当成未定义函数编译直接报错。int main()是程序入口程序运行时操作系统会从这里开始执行。printf是输出函数双引号里的内容会原样打印到控制台窗口\n表示换行。return 0;表示程序正常结束返回0给操作系统这行不写有些编译器也能过但规范写法建议写上。输入完之后先按一下CtrlS保存文件。然后注意顶部工具栏中间位置确认那个下拉框里显示的是Debug和x86或x64一般默认就是Debug x64。接下来可以直接按CtrlF5运行程序一个黑色控制台窗口会弹出来上面显示两行字然后窗口停留住等你随便按一个键才关闭——这个行为正是我们期望的。提示CtrlF5是开始执行不调试运行完窗口会停住让你看结果F5是开始调试运行完如果没断点窗口会在程序结束后直接关闭。初学阶段请一律用CtrlF5运行程序。3.4 编译、链接和运行这三个概念新手必须分清你点下本地 Windows 调试器或CtrlF5时背后其实发生了三个阶段编译、链接、运行。编译是把.c源文件翻译成机器码目标文件.obj链接是把目标文件和库文件组合成可执行的.exe运行才是真正弹出黑窗口执行程序。很多新手分不清这三步报错了也看不懂是哪个阶段的问题。比如报错里有LNK开头的那是链接错误有error C开头的才是编译错误程序弹出来但结果不对是运行逻辑错误需要调试。在VS里这些过程都是自动的但了解这个流程对后面排查报错会特别有帮助。4. 跑通Hello World之后C语言的学习主线应该怎么走4.1 数据、运算和输入输出劝退率最高的一关第一个程序跑通之后紧接着的任务就是让程序听懂人话。C语言里最核心的东西是变量和数据类型int存整数、float和double存小数、char存单个字符。新手要把这三四个类型彻底搞清楚每种类型占几个字节、能表示的范围是多少、什么时候用整数什么时候用小数。输入输出的核心函数就是printf和scanf。printf负责输出scanf负责接收键盘输入。这里我特别提一下scanf这个函数它在VS2022里如果不写第一行#define _CRT_SECURE_NO_WARNINGS会直接报C4996错误这也是搜索引擎里c语言怎么让顾客填数字这类问题出现的原因。正经写法应该是scanf_s但网上大部分教材用的是scanf所以用VS学习时要么加上那行宏定义要么坚持用scanf_s二选一不要混着写。我个人的建议是按你教材来教材写scanf就用scanf加宏定义等考试或者用别的编译器时这一行宏定义注释掉就行很方便。4.2 分支和循环程序逻辑的开始数据有了接着要让程序根据条件做不同的事情这就到了if、else、switch分支语句。再配合while、do-while、for循环你的程序就有了重复执行的结构。新手经常纠结while和do-while的区别其实核心就两点do-while至少会执行一次循环体while可能一次也不执行do-while以分号结尾while不需要。这个阶段还要理解一个特别重要的操作——%取模运算符判断一个数能不能被整除全靠它比如判断闰年、求水仙花数都要用到。建议在这个阶段把教材课后习题都做一遍找最大值、求阶乘、判断素数、打印九九乘法表每个题目至少亲手敲一遍代码不要只看不练编程是手上功夫。4.3 函数把代码拆成块当代码写了一两百行之后你会发现全挤在main函数里会乱成一团。这时候就需要学函数了把一个功能封装成一个函数需要用到时调用它就行。函数的核心就三件事函数名、参数、返回值。学函数的时候顺便把局部变量和全局变量、作用域这些概念搞清楚否则后面写大程序变量名冲突和值被意外修改的问题会让人崩溃。4.4 数组与指针C语言的灵魂数组是同一类型变量的连续集合当你需要存储全班30个人的成绩时定义30个int变量是不可想象的用数组int scores[30];就解决了。数组的下标从0开始这一点新手经常搞混。指针可能是C语言劝退率最高的知识点也是python这么火为什么还要学C这个问题绕不开的答案。指针就是存放变量地址的变量。你可以把内存想象成一排编了号的储物柜普通变量是柜子里存的东西指针是记着柜子编号的小纸条。通过指针可以直接访问和修改那个柜子里的内容。学指针时要死死抓住两个运算符取地址、*解引用再理解指针和数组的等价关系——数组名在大部分表达式中会隐式转换成指向首元素的指针。初学阶段不必把指针的所有高级用法都吃透但指针变量怎么定义、怎么传入函数、怎么通过指针修改函数外部的变量这三件事必须滚瓜烂熟。很多线上练习题比如字符串逆序冒泡排序的解法本质都是在用指针或者数组下标操作内存块。4.5 字符串、结构体、文件实用三件套字符串在C语言里不是一种原生类型它就是一个以\0结尾的char数组。字符串逆序strcpy用法strstr能否查找二进制内存这类问题全是在考你字符数组和指针的操作。字符串相关的库函数strlen、strcpy、strcmp、strcat、strstr要一个不落地理解清楚重点知道它们的返回值、会不会修改原字符串、是否会越界。结构体struct是把不同类型的数据打包成一个整体比如一个学生有姓名、学号、成绩这就适合用一个结构体表示。学完结构体配合文件读写函数fopen、fprintf、fscanf、fread、fwrite就能做点正儿八经的小项目了比如写一个学生成绩管理系统把数据存到文件里下次运行还能读出来。这也是为什么搜索引擎里会有c语言文件读写操作代码、虚拟存储器管理c语言这类需求的根本原因——学到文件这章大家开始想写一个真正的项目了。这时候你才算是把C语言的地基打完了。5. 初学C语言最容易踩的坑我当年全踩过5.1 C4996报错scanf安全警告到底是什么很多新手在VS2022里写scanf(%d, num);编译报错提示scanf: This function or variable may be unsafe。别慌这不是你的代码错了是VS出于安全考虑默认禁用了一些老库函数。解决方案有三种在源文件第一行加#define _CRT_SECURE_NO_WARNINGS我推荐这个跟教材写法保持一致。把scanf改成scanf_s这是VS特有的安全版本。在项目属性里改预处理器定义操作繁琐不推荐。这里注意的是如果你加的那行宏定义在#include stdio.h之前整个文件就都会生效。如果写了还是报错检查一下是不是拼写错了或者是不是放在注释里了。5.2 输出中文乱码问题用printf输出中文在VS2022里偶尔会出现中文变成一堆乱码或者显示为问号。这个问题的根源是源代码文件的编码和编译器解释编码不一致。VS2022新版默认源文件是UTF-8带签名BOM编码控制台窗口是GBK代码页可能不匹配。最简单粗暴有效的方法用CtrlS保存文件时在弹出的保存对话框中点保存按钮旁的小箭头选择编码保存然后把编码改成简体中文GB2312或者带签名的UTF-8再重新编译运行。注意VS2022在文件菜单里可能没有直接高级保存选项你可以文件-另存为-点保存旁的下拉箭头也能进编码保存页面。改完编码后大多数中文乱码问题就解决了。5.3 程序一闪而过看不到输出用F5运行程序时控制台窗口会在程序执行完毕的瞬间关闭你根本看不到printf输出的内容。原因很简单F5是调试模式程序结束就关窗口。解决方式有三种任选一种用CtrlF5运行VS会自动在结束后加上请按任意键继续窗口会停住。在return 0;之前加一句getchar();让程序等待键盘输入再退出。在return 0;前加system(pause);需要#include stdlib.h也常用但多含一个系统调用略不干净我建议用getchar()。如果你用了getchar()但窗口还是秒关大概率是有个scanf操作把回车键读取走了getchar()读到了残留的换行符直接继续执行了。这种缓冲区残留字符的问题用getchar()时非常常见后面学到循环输入时要格外留意。5.4 编译成功但运行结果不对学会打断点看变量代码能编译能运行但输出结果不对这种情况下新手最喜欢做的是对着代码发呆。正确姿势是用断点调试在代码左边灰色栏上点击一下会出现一个红色圆点断点然后按F5启动调试。程序会执行到断点那一行自动暂停这时你可以把鼠标悬停在变量名上看到它当前的值也可以按F10单步执行一行一行地看变量如何变化。排查结果不对的问题这个办法比盯屏幕有效十倍。调试窗口里还有一个局部变量面板和监视面板可以把你想看的变量拖进去实时查看配合断点指针和数组越界的问题基本都能定位。这是一项必须掌握的技能越早学会越值。5.5 用错代码模板把C程序写进C项目如果你新建项目时选错了模板比如选成了控制台应用然后又把代码写进去会出现一些预编译头文件的报错stdafx.h missing是经典中的经典。遇到这种问题干脆放弃这个项目按第3章的流程重新建一个空项目。不要试图在原项目里修修补补浪费时间。很多初次接触VS的人三天两头新建项目失败其实都是模板选错的问题。这里再多说一句如果你发现自己新建项目时找不到空项目可能是安装时没有勾选C的桌面开发工作负载。打开Visual Studio Installer点修改勾上这个组件等它装完再重启VS就能看到空项目模板了。这个问题在技术社区里反复被问几乎每周都有新手卡在这一步。6. 关于Python这么火为什么第一门课还是C语言的一点看法6.1 C语言教的是底层直觉现在确实很多人说Python语法简单、上手快为什么不直接拿Python当第一门语言我的观点是Python适合当工具但C语言适合当基础。C语言里你需要手动定义变量类型、自己管理数组长度、理解指针和内存地址、还要关心文件缓冲区这些概念全都是在和计算机的真实工作方式打交道。用Python可能一行input()就解决了输入问题但你对背后发生了什么一无所知用C你写scanf(%d, num);就得知道是取地址、num是一块内存、%d是格式说明符——这些细节构成了一个程序员对程序到底怎么跑起来的的直觉。当然我也不是说Python不用学而是建议先把C的核心概念打牢有了C的基础再学Python会特别快因为很多东西是相通的只是Python帮你把细节藏起来了。反过来直接学Python的人一旦遇到内存、指针、底层性能相关的问题往往会一头雾水。6.2 C语言的语法短期学调试能力长期练对大多数人来说学C语言这门课其实只持续一个学期。一个学期能学完语法、数组、函数、指针、结构体、文件但真正的能力增长靠的是大量调试当你某天晚上调一个指针bug调到十一点突然定位到问题所在的那一刻你对C语言的理解会突飞猛进。所以别怕报错报错和调试是你成长最快的时候把VS2022的断点调试用熟练比把代码背下来有用得多。6.3 学习节奏建议我见过太多人第一个星期热情高涨学到指针就卡住然后放弃。指针卡住很正常不丢人。遇到实在想不通的知识点可以先把代码抄下来运行出结果再回来一点一点理解。抄代码并运行是一种非常有效的学习方法尤其是初学者阶段。把示例代码亲手敲进编译器、编译报错、自己修正、看输出结果这个过程比看十遍书都有用。如果你能坚持到文件读写写出一个学生成绩管理系统哪怕代码很简陋你的C语言课程已经算学得不错了。最后再分享一个小技巧VS2022的代码编辑器支持代码片段补全输入for后连按两下Tab会自动生成一个for循环框架输入#include后VS会列出常用的头文件供你选择。这些小功能不影响写代码的正确性但能让你敲代码的体验舒服不少。如果你身边有同学卡在环境配置上把这篇文章转给他少走点弯路比什么都强。