ARTICLE DETAIL

资讯详情

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

秋招备战:零基础C语言Day1自学全记录

秋招备战:零基础C语言Day1自学全记录 秋招倒计时还在刷手机焦虑不如把焦虑换成键盘声。这篇是我作为零基础菜鸟冲击秋招、自学C语言第一天的完整记录学了什么、怎么学的、踩了哪些坑、为什么这么安排全写在里面。如果你也准备秋招、刚接触编程或者学了点Python想补C语言的地基这篇可以帮你把第一天的路走得更稳。C语言这东西看起来老却是秋招笔试和面试绕不开的坎。无论你投后端、嵌入式还是量化C语言基础题、指针、内存相关的题出现频率都很高。我决定从零开始啃C语言不是因为课程要求而是因为一个很现实的问题秋招笔试里C语言题根本躲不掉。既然躲不掉不如主动拿下。我之前没有任何系统编程基础只在网课里摸过一点Python的皮毛所以这一篇记录的完全是菜鸟视角的入门过程不装懂也不绕路。1. 开局思路为什么秋招前还要从C语言从头啃1.1 先搞清楚C语言在秋招里到底考什么我在规划Day1之前先把目标岗位近三年的笔试真题翻了一遍发现C语言相关的考点高度集中基础语法变量、类型、运算符、输入输出scanf/printf、分支循环、数组和字符串、指针、内存管理、结构体与文件操作。其中指针和内存管理是大头几乎每个公司的笔试题里都有几道而且都是那种表面考代码、实际考底层理解的题。网上的经验贴很多都在说算法刷题但忽略了C语言本身才是很多岗位的入场券。举个很实际的例子有家公司笔试直接给了一段C代码让你说出char *p hello和char p[] hello的区别这题不练过C语言根本无从下手。我第一天就把这个列入必须搞懂的知识点虽然那天还没讲到这一步但先让自己有个心理预期。1.2 给自己定一个“能跑起来”的Day1目标自学最怕贪多。我看过太多人第一天雄心勃勃看到指针、结构体、文件操作结果一个周末就放弃了。所以我把Day1的范围控制得非常小环境搭建、变量与数据类型、输入输出、条件与循环、一道综合练习题。这几个东西看起来基础但反而是很多人后来写代码出bug的根源。我还给自己定了一条原则每个知识点必须亲手敲一遍代码、编译、运行、调试光看不写等于没学。语法书翻一百遍不如自己跑通一个程序。Day1我给自己定的验收标准是不查资料独立写出一个九九乘法表并且能解释清楚for嵌套循环每一步在干什么。这个标准不高但对零基础来说够具体、够有成就感。1.3 训练思路像刷题一样学语法我发现学C语言最容易掉的坑是“看书全会、上手全废”。所以从第一天开始我就刻意用刷题的方式学语法。每学一个新的语法点立刻去找一道对应的题目做。比如学完scanf就去写一个“输入日期计算是第几天”的小程序学完循环就去写九九乘法表和冒泡排序。这种方式的好处非常明显语法不再是死知识而是解决问题的工具。而且秋招笔试本来就是做题用题目来驱动学习等于把备考过程前置了。后续我也会保持这个节奏Day1偏向打地基等到Day3、Day4再开始系统地刷字符串和指针的题。2. 环境搭建vscode MinGW5分钟跑通第一个C程序2.1 为什么选了vscode而不是Visual Studio或Dev-C网上关于C语言编译器、IDE的争论非常多Visual Studio功能全但是安装包巨大、启动慢Dev-C太老、代码补全基本等于没有Clion要付费。综合考虑我选了vscode加MinGW的组合。这个组合的优点很多免费、轻量、跨平台而且现在很多公司内部开发也在用vscode提前熟悉这套工作流不亏。配置过程其实很简单步骤记录在这里先装vscode再装MinGW-w64把MinGW的bin目录加到系统环境变量PATH里然后在vscode里安装C/C扩展插件。整个过程10分钟就能搞完真正花时间的反而是后面配置编译任务让vscode可以通过一个快捷键直接编译运行C文件。我建议新手第一次配置时不要怕麻烦把这一步搞定后面写代码的效率会提升很多。注意MinGW安装时不要改默认安装路径路径里不要有中文。我身边有人因为路径带中文导致编译器一直报错排查了半天才发现是这个原因。2.2 配置tasks.json实现一键编译运行vscode本质上是个编辑器它不自己编译代码需要调用MinGW的gcc编译器。我在项目根目录创建.vscode/tasks.json把编译命令写好这个文件的作用是让vscode知道按某个快捷键时执行什么命令。我的配置大致是调用gcc编译当前打开的文件生成可执行文件然后在终端里运行。这个配置的过程比较机械网上教程很多照着抄一遍就能用。但我要强调一个新手容易忽略的细节编译和运行是两个步骤编译报错时不看错误信息直接在终端里乱试是浪费时间。我第一次编译时遇到xxx was not declared in this scope还不知道什么意思后来才知道是变量未声明。所以从第一天起我强迫自己每次编译报错都先读第一行错误信息哪怕看不太懂也要自己先分析一下再复制到搜索引擎里问。2.3 验证环境第一个程序用“打印日期”而不是Hello World几乎所有人第一个程序都是Hello World我也写了但很快就发现Hello World对学习输入输出的帮助太有限了。它只用到了printf没用到scanf也没涉及变量类型。所以我第二个程序直接写了一个“输入年月日计算这一天是这一年的第几天”的小程序这个程序非常经典用到了scanf、printf、if判断、循环、数组一个程序就把Day1的大部分知识点串起来了。这个题目网上有很多版本我自己在写的时候一开始忽略了闰年的判断结果2月29日的输入一直算不对。后来才想到年份能被4整除且不能被100整除、或者能被400整除才是闰年。这种bug在笔试里很容易出现因为评委和面试官非常喜欢在这种边界条件上挖坑。所以环境搭建完我强烈建议从这样一个“有实际逻辑”的小程序开始而不是满足于Hello World。3. 打地基变量、数据类型与输入输出的一次性讲透3.1 int、char、float、double到底怎么选Day1学变量类型的时候我最初的理解就是“能存数字的就是int”直到后来写了日期计算程序才发现类型没选对会出大问题。比如两个int相除如果结果是小数C语言会直接截断而不是四舍五入。这个特性让很多初学者摸不着头脑其实就是整数除法的规则。所以涉及到小数一定要用float或double精度要求高的时候直接用double。limits.h头文件里定义了各种类型能表示的最大最小值这个文件对搞懂类型上限很有用。热词里提到的“使用stdio.h和limits.h解决5*5鞍点问题”那个题目的考点之一就是数据范围和初始值的设计我在Day1先把这个概念放进来就是为了后续做题不懵。比如找出矩阵鞍点的时候通常需要设一个初始最大值max INT_MINlimits.h里定义的最小整数这样矩阵里任意一个数都比它大才能正确比较这个技巧在后续刷题中非常重要。3.2 scanf的“坑位”理论地址符不要丢scanf是C语言入门第一个大坑。我第一天写的代码里scanf(%d, a)的忘写了编译竟然没有报错但是运行的时候程序直接崩溃。这个问题几乎每个初学者都会遇到。理解背后的原理就很清楚了scanf要干的活是把从键盘读到的值放进变量a的存储空间里它需要知道a的地址所以要用a来告诉它“a住在哪里”。我后来用一个生活化的类比来帮助记忆scanf像一个快递员它要把包裹投递到变量a的家门口a就是a家的门牌号。你不给门牌号快递员只知道收件人名字自然就投递失败了。这个类比虽然有点糙但对记忆深刻程度很管用。热词里专门有“c语言学习之scanf”说明这个点确实是初学者的重灾区。printf则相反它是把变量的值打印出来所以直接写变量名就行不需要加。这个“一个需要取地址、一个不需要”的对比几乎每周都能在编程群里看到有人问每次看到我都想说第一天认真记一下后面能省很多事。3.3 while和do-while的差异这道面试题是真的会考Day1我特意把三种循环结构放在一起对比for、while、do-while。很多人学的时候觉得随便用一个就行但其实它们的适用场景完全不同。for适合已知循环次数的情况while适合不知道循环次数、只知道循环条件的情况do-while和while的唯一区别是do-while至少执行一次循环体而while一次都不执行也是可能的。我记得热词里就有“c语言while和do-while区别”这确实是一道高频面试题甚至笔试题里会直接让你写出两种循环在处理边界输入时的不同结果。举一个最直观的例子如果需要一个程序处理“不断输入数字直到输入0为止”用while完全可以。但如果我要实现“无论条件是否满足先做一次再判断是否继续”比如游戏菜单至少显示一次do-while就是唯一选择。这个区别在秋招笔试里很经常包装成“什么情况下两种循环等价”的判断题。3.4 float比较的精度陷阱还有一个非常隐蔽的考点就是浮点数不能直接用比较相等。原因在于浮点数在计算机里是二进制近似存储的很多十进制小数比如0.1没办法精确表示。所以0.1 0.2 0.3这个表达式的结果是false这是C语言以及几乎所有编程语言的通病。我当时第一次遇到这个事是在写一个计算器练习时判断结果是否等于0用了if (result 0.0)结果一直不成立排查了好久才发现是精度问题。正确的做法是判断两个浮点数的差的绝对值是否小于一个很小的数比如if (fabs(result) 1e-6)。这个细节在面试里很容易被考到很多人工作了几年都没搞明白第一天就掌握的话后面的路会顺很多。4. 第一次写多文件逻辑用数组循环完成5x5鞍点问题4.1 什么是鞍点为什么拿它当Day1的练手鞍点问题是我在热词里看到的一个经典C语言题目在一个5x5的矩阵中找出一个元素它在所在的行上最大、在所在的列上最小。这样的点可能不存在也可能存在多个通常题目说只要找一个。我把它作为Day1的综合练习因为这个题目非常巧妙地涵盖了数组遍历、循环嵌套、条件判断、极值初始化这几个核心知识。很多初学者做题时会直接上手想一步到位写出来结果循环嵌套一来就绕晕了。我自己的做法是先拆逻辑再写代码第一步找到每一行的最大值以及它所在的列位置第二步检查这个最大值在其所在列是否是最小值第三步如果满足条件就输出鞍点位置循环结束还没找到就输出“不存在”。把这个流程写下来代码自然就出来了。4.2 我第一次写的错题版本与反思这里记录一下我的错误版本简化版我用max a[i][0]作为每行最大值的初始值然后遍历整行找更大的值。这个思路看起来没问题但处理列最小值时我用min max作为初始值再去和列上其他元素比较这时候就会出问题因为max本身可能是这列最小的但列上其他元素如果比max大我的程序就会错误地认为“该点不是鞍点”导致明明存在鞍点却输出不存在。正确的思路是用limits.h中的INT_MAX作为最小值搜索的初始值。对于列最小值的判断应该把该行找到的最大值单独存储然后重新遍历这一列的所有行检查是否有一个元素比它小如果有说明它不是列最小鞍点不成立。这个“初始值怎么设置”的问题是初学者写极值类题目最容易踩的坑。热词里特别提到“使用stdio.h和limits.h用c语言解决计算5*5鞍点问题”用limits.h不是炫技而是为了让初始值设置更安全这一点我写完之后才真正理解。4.3 补充两个头文件的功能边界在写这个题目的过程中我还顺带理清了stdio.h和limits.h的分工。stdio.h管输入输出scanf和printf的声明都在里面几乎所有程序都要用到。limits.h则专门定义各种整数类型的最大值和最小值比如INT_MAX、INT_MIN、CHAR_MAX等。它不提供任何可调用的函数只提供宏定义值所以它常常被用在“需要初始化极值”的场景。热词里还有一个“c语言库函数大全”我想提醒的是不要因为它是“大全”就去背真正常用的库函数就那么几十个输入输出、字符串处理、内存操作、数学函数这些足够了。后面遇到需要“不常见函数”的题目时再针对性查阅效果更好。Day1就把stdio.h和limits.h吃透比囫囵吞枣把所有头文件扫一遍强得多。5. 实战初体验九九乘法表、冒泡排序、字符串逆序到底在练什么5.1 九九乘法表不是让你背输出是教你控制嵌套循环九九乘法表是热词里的高频题目几乎每个C语言初学者都写过。但很多人是抄一遍代码、跑通就完事了我觉得这样浪费了这个题目最大的教学价值。九九乘法表的核心考点是内层循环的边界如何依赖于外层循环变量。它要求第i行只输出i列所以内层循环的终止条件必须是j i这就和普通的全矩阵遍历区分开了。我写这个程序时做了一处小的扩展除了正向输出我还尝试用%2d控制输出宽度让对齐更好看然后又把行列交换输出一个倒三角版本的乘法表。这两个变体让我对嵌套循环的理解深了很多特别是换行符\n该放在哪个位置——放在内层循环外面、外层循环里面这个位置一错整个输出就乱套。后续刷任何矩阵、图形打印类题目九九乘法表的经验都能直接复用。5.2 冒泡排序一次理解时间复杂度从哪冒出来的冒泡排序是另一个高频考点热词里单独把“冒泡排序c语言”列出来说明它确实是面试笔试的常客。我Day1就把它写了很多教程会把冒泡排序放在指针和数组之后实际上它只用到了数组、循环和临时变量交换三个知识点放在Day1完全够用。冒泡排序的核心逻辑其实一句话就能说清每一轮把相邻的两个元素比较如果顺序不对就交换这样每一轮都会把当前未排序部分的最大值“冒泡”到末尾。外层循环控制进行多少轮最多n-1轮内层循环控制每一轮比较到哪里到已排序部分的边界之前。我一开始会写错内层循环的边界条件导致数组越界或者多比较了一次。后来我养成了“用具体小例子手动模拟一轮循环”的习惯比如拿[3,1,4,2]自己走一遍边界条件是什么一下就看明白了。时间复杂度的感念我也是通过冒泡排序第一次有了直观印象n个数冒泡排序需要跑大约n(n-1)/2次比较所以时间复杂度是O(n²)。以后学到快速排序的O(n log n)再对比这里的感受就会理解“为什么要优化算法”不是一个空洞的结论。5.3 字符串逆序PTA题目背后藏着的两个知识点字符串逆序是热词里“字符串逆序c语言pta”提到的题目Day1我只要理解思路并没有完整实现指针版本。这道题最简单的做法是输出时从最后一个字符往前打印但PTA的要求往往限制不能使用库函数。这个限制背后其实藏着两个重要考点一是理解字符串在C语言中是以字符数组存储、以\0结尾的二是指针遍历字符串的方式。字符串相关的函数如strlen、strcpy、strcat都在string.h头文件里热词里“c语言字符串函数”“c语言库函数大全”都提到了这些。我第一天先搭建了一个基本的认知框架这些库函数本质上是封装好的循环理解了它们背后的手工实现用起来才不会出问题。后续Day2、Day3我会单独花一天专门攻克字符串与指针的题目因为这块内容在秋招笔试中的出镜率实在太高了。6. 菜鸟Day1最容易犯的错错误排查与避坑速查6.1 编译报错不要慌先学会读三行信息很多初学者包括我遇到编译报错第一个反应是“完了代码废了”然后把错误信息复制到搜索引擎。但编译器的错误提示虽然看起来密密麻麻其实最关键的就是前几行。error:后面跟的才是真正的错误信息warning:只是提醒你潜在风险不阻止程序运行但最好也别放过。常见的编译错误大概就那几类变量未声明、括号不匹配、漏写分号、类型不匹配、数组越界。Day1我遇到的最高频错误大概就是漏写分号和scanf漏写。一个非常实用的技巧是看到第一个错误先修、重新编译再看下一个错误。因为很多后续错误是第一个错误导致的连锁反应你可能根本没有那么多问题编译器的提示有时候会连坐一大片。6.2 变量未初始化的“随机值血案”C语言和Python有个很大的不同C语言不会自动把局部变量初始化为0。如果你声明一个int a;然后直接打印a你得到的将是一个不确定的值可能是0也可能是某个很大的数甚至每次运行都不一样。这个特性让很多初学C语言的人栽了跟头因为同样的代码在别人机器上可能“碰巧”输出0在你机器上却是乱码让人怀疑是编译器的问题。避开这个坑的方法很简单使用变量前先赋值。比如求和变量sum一定要写成int sum 0;。热词里有一项是“c语言常见错误大全”这个“变量未初始化”就排在前几名。你要在面试中体现专业性可以在自我介绍环节主动提一句“我了解C语言局部变量默认值是未定义的”这会让面试官觉得你学过底层而不是只会抄代码。6.3 死循环的控制台风暴Day1写循环时我写出了一个经典的死循环忘记在循环体里更新循环变量。比如while (i 10)的花括号里没有i程序就会一直在循环里打转。在vscode的终端里这个程序会疯狂输出只能按CtrlC强制终止。我当时的第一个反应是慌后来才知道CtrlC是终止当前运行程序的快捷键这个知识虽然基础但对菜鸟来说是真的救命的。避免死循环还有一个小技巧给循环加上“最多执行多少次”的保险。比如调试一个不确定会不会结束的循环时可以先临时把while (condition)改成while (condition count 1000)加一个计数器。如果发现循环执行了1000次还没结束至少说明条件设计有问题可以及时停下来分析而不是干等程序卡死。6.4 乱码和控制台窗口一闪而过Windows下运行C程序还有一个经典问题程序执行完控制台窗口一闪而过什么都看不清。这是因为程序运行结束窗口被系统自动关闭了。解决方式一是用getchar()或者system(pause)让程序暂停等待输入二是在vscode里配置好tasks.json在终端里运行这样窗口不会自动关闭。我推荐第二种方式因为第一种方式会让你在写代码时多写一些和业务无关的暂停语句而后期的练习题根本不需要这些。另外一个和乱码相关的问题就是中文字符串输出在Windows终端里经常变成乱码。这是因为源文件编码和终端编码不一致。最简单的处理办法是如果输出的内容不涉及中文直接用英文如果必须输出中文可以把源文件改成GBK编码保存或者用UTF-8编码并在终端里设置代码页。这个细节在平时练习里可能影响不大但在期末作业或课程设计里经常被扣分还是要留意。7. 写在Day1结尾的一些心里话第一天结束了我没有成为C语言高手但我知道了C语言跟Python完全不同的脾气。它更贴近计算机本身所有的变量都必须先声明、内存要自己在意、字符串没有现成的对象一切都裸露在程序员面前。这种“裸露”让很多初学者难受但也正是这种对底层细节的掌控感才是C语言在秋招中一直被重视的原因。如果让我给同样零基础、打算自学C语言冲击秋招的人一个建议我会说第一天不要贪多把环境配好、把变量和循环吃透、把一道综合题写出来就够了。后面还有指针、字符串、内存管理、结构体、文件操作这些大山等着爬但地基不打牢后面只能是空中楼阁。我最想强调的是一定要亲手敲代码。不管是九九乘法表还是鞍点问题自己一个字一个字敲出来、编译、报错、改错、跑通这个过程中获得的经验远比看十遍教程更值钱。菜鸟学C语言第一天最重要的不是“学会了多少语法”而是“建立了自己发现问题、解决问题的能力”。这条路很长但每一步走下去都是实打实朝着秋招更近一步。
返回列表