简介C从入门、核心到提高的系统讲义笔记面向零基础初学者与需要夯实语法根基的开发者聚焦环境搭建、语法规范与数据类型等起步阶段最易卡壳的环节。整份资料为1个PDF文件压缩包约5.07MB结构完整、篇幅集中便于顺序阅读与随手查阅。内容按章节层层推进从Visual Studio中创建项目、添加源文件、编写并运行第一个程序的四步流程讲起拆解#include与命名空间的作用、cout输出与换行、单行及多行注释的写法再落到变量定义与初始化、#define宏常量与const常量的区别、关键字保留清单、标识符命名规则并以表格对比short、int、long、long long及float、double的占用空间与有效数字范围。指针、数组、类、模板与异常处理等进阶主题亦有铺垫方便后续延伸。已有25991人学习适合作为课程配套笔记或自学对照清单。1. 先弄明白C 到底是一门什么样的语言很多人敲下「C 入门」这几个字的时候心里其实揣着两个问号这玩意儿是不是特别难我连一行代码都没写过真的能学会吗先给结论C 确实比一些语言啰嗦要多写几个字、多交代几句但它也是最讲道理的语言之一你写的每一行机器几乎都会老老实实按你说的执行很少玩玄学。这份 C 入门讲义笔记管的就是「从完全不懂到能自己写出小程序」这一段路它属于一份打地基用的讲义不是给熟手看的参考手册。它的定位很清楚把最基础的那批概念——程序怎么跑起来、变量是什么、数据分几种、运算符怎么用——用大白话过一遍。适合三类人完全没碰过编程的新手、想补一补语法基础的同学以及学过一点别的编程语言、被类型和指针绕晕后想回来重新打地基的人。读完你手里会有一个真能跑起来的小程序还有一张不糊涂的知识地图知道下一步该往哪走。2. 零基础第一步把第一个 C 程序从头跑起来学编程有个很反直觉的地方你不可能先把所有概念都搞懂再动手那样永远动不了手。正确的顺序是先让一个最小的东西跑起来亲眼看到屏幕上真的出现一行字再回头问这行字是怎么来的。这跟学做菜一样第一节课不是研究美拉德反应而是先把鸡蛋煎熟。煎糊了也没关系锅还在。2.1 先认识你手里的工具IDE 是什么写 C 需要一个「集成开发环境」英文缩写 IDE。听着唬人其实你可以把它想成一个厨房编辑器是案板负责让你切菜写字编译器是灶台负责把你写的文字翻译成机器能听懂的东西运行按钮就是点火点一下菜就下锅。厨房把这三样东西摆在一起你就不用切完菜端着案板跑去隔壁借灶台了。新手最容易卡住的地方恰恰是把「写代码」和「跑代码」当成同一件事。实际上它们是两步你先写出一份纯文本的源代码文件编译器再把它翻译成一个可执行程序最后你运行那个程序。所以代码写错了有两种错法一种是语法上就不通编译器直接拒绝翻译这叫编译错误另一种是翻译通过了但跑起来结果不对这叫逻辑错误。前者会明确告诉你哪一行有问题后者只能靠自己盯。知道这个区别你以后看到一屏红字就不会先慌。至于用哪个 IDE入门阶段不用纠结。只要它能新建项目、能建 .cpp 文件、有一个明显的运行按钮就够用了。工具是厨房菜好不好吃主要看手艺别在挑锅上耗掉三天热情。2.2 四个步骤建项目、建文件、写代码、按运行把这套流程拆开其实只有四步我按顺序写一遍你照着做就行打开 IDE新建一个项目Project选择「控制台应用」这类模板。项目你可以理解成一个文件夹它会把你的代码文件、配置、生成的可执行程序都装在一起不容易丢。在项目里新建一个源文件。源文件就是存代码的地方C 的源文件后缀是.cpp这个名字要记住写错了编译器不认。在这个.cpp文件里敲代码。注意是敲不是复制粘贴之后再也不看——第一次学手敲一遍能让你记住分号、括号这些细节。点运行或者按快捷键编译并运行。如果一切正常会弹出一个黑窗口里面有你输出的那行字。第三步和第四步之间IDE 自动帮你做了「编译」和「链接」两件事先把.cpp翻译成机器码再把用到的库拼进来最后生成一个.exe可执行文件。这个过程你暂时不用管细节但要知道它存在因为后面报错的时候报错信息大多来自这一步。2.3 第一个例子五行代码的 Hello world新建好文件之后把下面这段代码敲进去。这是几乎所有 C 教材的第一课别看它短里面每一行都有活干#includeiostream // 引入输入输出库cout 才能用 using namespace std; // 使用标准命名空间省去写 std:: 前缀 int main() { // 程序的主入口从这里开始执行 cout Hello world endl; // 向屏幕输出文字并换行 system(pause); // 暂停窗口等你按任意键 return 0; // 告诉系统程序正常结束 }运行之后黑窗口里会出现Hello world这几个字然后停在那里等你按键。别小看这一步它同时验证了三件事你的工具装好了、代码能编译通过、程序能正常运行。这三件事任何一件出问题都会在这里暴露。下面把几个关键部件一个个拆开说清楚#includeiostream是一句「引入声明」意思是把输入输出相关的工具箱搬进来。iostream拆开看就是 input/output stream输入输出流。没有这一行你在下面用cout的时候编译器会说「我不认识这个名字」。using namespace std;解决的是「名字太长」的问题。标准库里的东西都住在一个叫std的命名空间里正常写法应该是std::cout。加这一行之后你写cout就行编译器会自动去std里找。入门阶段这么写没问题等你以后写大一点的项目会重新考虑要不要这么图省事。int main()是程序的大门运行程序就是从这里进来的。int说明这个函数最后要交回一个整数所以你在末尾能看到return 0;0 表示「一切顺利」。花括号{ }是这扇门的范围里面的内容都属于它。cout Hello world endl;里的你可以念成「送过去」把右边的东西送到屏幕上去。endl是 end line 的缩写作用是换行。注意这一行结尾的分号C 里每条语句都要用分号收尾漏了必报错这是新手第一天的高频事故。system(pause);不是 C 本身的语法它的作用是让控制台窗口停住等按键。不加的话程序跑完瞬间窗口就关了你会以为「什么都没输出」。这句在 Windows 环境下很常见也是讲义里最省事的一种写法。提示如果你手敲的时候发现system那行报错先检查是不是漏了分号或者把中文标点敲进去了。C 只认英文半角符号这个坑几乎人人踩过一次。2.4 怎么判断自己真的跑通了判断标准很简单窗口里出现了Hello world并且窗口停住没消失你按一下键盘它才关掉。三条同时满足说明你的环境和代码都是好的可以往下走了。如果窗口一闪就没影多半是system(pause);这一行漏了或者拼错了如果编译就失败先看报错里的行号八成是分号、括号、引号这三件小事如果提示找不到某个标识符检查是不是把cout写成了Cout或countC 是严格区分大小写的写错一个字母就是另一回事了。把错误信息当成翻译软件看不要当成判决书它其实在告诉你「第几行、哪个词、我不认识」耐心读两遍就懂了。3. 变量、常量与命名让数据有个地方住程序光会打印字是不够的它还得记住东西。你写一个算账的小程序总得把用户输入的价格存起来这就是变量的活。这一章讲三件事怎么把数据存起来变量、怎么规定某些数永远不许改常量、以及给这些东西起名字有哪些讲究。3.1 变量给一块内存起个名字计算机的内存可以想象成一排储物柜每个柜子有自己的编号。变量做的事情就是给某个柜子贴上一张纸条写上你方便记住的名字之后你就可以直接喊名字不用背编号。语法很固定三个部分缺一不可数据类型、变量名、初始值。#includeiostream using namespace std; int main() { // 语法数据类型 变量名 初始值; int a 10; // 声明一个整型变量 a并放进去 10 cout a a endl; // 输出a 10 a 20; // 变量可以改把柜子里的东西换成 20 cout a a endl; // 输出a 20 system(pause); return 0; }这里int是数据类型说的是这个柜子只能放整数a是变量名你随便起 10是初始化表示一建好就先放 10 进去。等号在这里不是数学里的「相等」而是「把右边的值装进左边」所以a 20;是合法操作它把柜子里的旧东西倒出来换新的。有个细节讲义里特意强调了C 在创建变量时建议一定给初始值。虽然很多时候编译器不强制但一个没初始化的变量里可能残留着上一次别人用过的数据这种错误查起来特别费劲属于典型的血泪经验。我建议你从第一天起就养成「定义即赋值」的习惯哪怕先给个 0。变量名起得怎样直接影响你三天后还认不认自己写的代码。a、b、c用来练语法没问题真写功能时请换成price、count、total这类一眼能看懂的名字。3.2 常量写死就不许改的数有些数天生就不该变一周七天、一年十二个月、圆周率。如果哪天有人手滑把它改了程序算出来的结果就全错。C 给这类数准备了两种写法都叫常量。#includeiostream using namespace std; // 写法一宏常量通常写在文件最上方没有分号 #define DAY 7 int main() { cout 一周有 DAY 天 endl; // DAY 8; // 报错宏常量不能被修改 // 写法二const 修饰的变量本质是变量但不能改 const int MONTH 12; cout 一年有 MONTH 个月 endl; // MONTH 24; // 报错const 后面不能改 system(pause); return 0; }两种写法的区别你现阶段只需要记这几点#define是预处理阶段的文本替换写的时候后面不加分号也不带类型const是真正的带类型常量编译时编译器会帮你检查类型对不对。入门阶段我更推荐先用const因为它有类型、出错信息也更清楚属于比较现代的习惯。宏常量你会在不少老教材里见到看得懂就行。为什么值得单独学这个概念因为常量是「防手滑」的第一道防线。你把不该变的东西标成常量将来某天不小心写了赋值编译器会当场拦住你而不是等到程序跑出离谱结果你才发现。这种「让错误早点暴露」的思路会贯穿你整个编程生涯。3.3 关键字和标识符命名规则C 里面有一批词是被语言本身占用的叫关键字比如int、const、return、class、new、static、void这些。它们不能拿来当变量名或常量名因为编译器会认错你写int int 10;编译器根本没法判断哪个int是类型、哪个是名字。这份讲义里附了完整的关键字表你不必背遇到起名报错时回来翻一眼就行。除了不能用关键字标识符也就是你起的各种名字还有三条硬规则只能由字母、数字、下划线组成不能有空格、横杠、中文。第一个字符必须是字母或下划线不能是数字。2day是错的day2是对的。区分大小写。age、Age、AGE是三个不同的名字混着用会莫名其妙报「未声明」。规矩之外还有一条建议讲义里也写了见名知意。名字要能说出它装的是什么studentScore就比s1强得多。另外别用单个下划线开头再去接大写字母这种写法那类名字在标准库里是保留的容易撞车。3.4 注释写给三个月后的自己注释是代码里给人看的部分编译器读到会直接跳过。它的价值不在于「老师要求写」而在于你三天后回来看自己的代码能立刻想起当时怎么想的。#includeiostream using namespace std; int main() { // 单行注释通常写在一行代码的上方或语句末尾 int price 100; // 单价单位元 /* 多行注释 适合在一段代码上方做整体说明 比如解释整块逻辑在干什么。 */ int count 3; cout 总价 price * count endl; system(pause); return 0; }单行注释用两个斜杠管到本行结束多行注释用斜杠加星号开头星号加斜杠结尾中间写多少行都行。注意多行注释不能嵌套你在一个多行注释里再写一个多行注释第二个的结尾符号会被当成第一个的结尾后面的代码就乱了这个坑踩过一次就记住了。注释写什么不要写「这一行是赋值」这种废话代码本身就说明了。要写的是「为什么」为什么这里要用这个数、为什么这里要绕一下。三个月后你会感谢现在的自己。4. 数据类型与输入输出为什么盒子要分这么多种大小上一章说变量是储物柜。那问题来了柜子为什么有大小之分因为你既不会用大货车装一颗鸡蛋也不会用鞋盒装一床被子。C 规定每个变量都得指明类型本质上是告诉编译器「给我留多大地方、按什么方式解读这段数据」。这一章把常见类型过一遍够用就行。4.1 整型家族与 sizeof谁占的地方大整数有四个常见类型区别主要在于占多大内存、能表示多大范围类型常见占用空间大致取值范围short2 字节-2^15 ~ 2^15-1int4 字节-2^31 ~ 2^31-1longWindows 4 字节64 位 Linux 8 字节跟平台有关long long8 字节-2^63 ~ 2^63-1有个关键字可以让你亲眼看到这些大小叫sizeof它的作用是统计某个类型或变量占多少字节#includeiostream using namespace std; int main() { // sizeof 后面可以跟类型名也可以跟变量名 cout short 占 sizeof(short) 字节 endl; cout int 占 sizeof(int) 字节 endl; cout long 占 sizeof(long) 字节 endl; cout long long 占 sizeof(long long) 字节 endl; system(pause); return 0; }跑一遍你会看到short int long long long这个大致规律。注意long那个「跟平台有关」它说明同一份代码在你的电脑和别人的电脑上可能占不同字节数这就是为什么写跨平台代码时要小心。入门阶段你只要记住日常整数用int装不下了再换long long。sizeof除了看大小还有一个实际用途你以后写数组、算字节数的时候会用到它。现在把它当成一个「量尺寸的尺子」就好。4.2 浮点型、字符型、布尔型小数、单字和真假要表示小数就得用浮点型。C 有两种常见选择单精度float和双精度double。类型占用空间有效数字float4 字节约 7 位double8 字节约 15~16 位#includeiostream using namespace std; int main() { float f1 3.14f; // 注意结尾的 f不加的话默认被当成 double double d1 3.14; cout f1 endl; cout d1 endl; float f2 3e2; // 科学计数法3 × 10^2 300 cout f2 f2 endl; system(pause); return 0; }3.14f结尾那个f是新手常见疑问点不加f编译器默认把小数当成double再赋值给float会有一次类型转换某些编译器会给你警告。养成加f的习惯能少掉一堆黄色提示。另外记住一句经验日常写小数直接用double精度更稳别为了省 4 个字节跟自己过不去。字符型char用来表示单个字符占 1 个字节#includeiostream using namespace std; int main() { char ch a; // 单引号且里面只能有一个字符 cout ch endl; cout (int)ch endl; // 强转成整数看到的是 ASCII 码 97 ch 98; // 也可以直接用编码赋值98 对应 b cout ch endl; system(pause); return 0; }这里有两个必须记牢的点。第一字符用单引号a字符串用双引号abc混用必报错。第二char里存的其实不是字符本身而是它的 ASCII 编码。所以a里面是数字 97(int)ch能把它看穿。这个认知很重要它会解释你以后遇到的「为什么a 1得到 98」这类怪事。布尔类型bool只有两个值true真本质是 1和false假本质是 0占 1 个字节。它主要用在判断条件上你在下一章的运算符里会大量用到。4.3 字符串与转义字符一串字和看不见的符号一个字符用char一串字符就要用字符串。C 里两种风格都能写#includeiostream #includestring // C 风格字符串必须引入这个头文件 using namespace std; int main() { // C 风格字符数组 char str1[] hello world; cout str1 endl; // C 风格string 类型更省心 string str2 hello world; cout str2 endl; system(pause); return 0; }入门阶段你优先用string它能直接赋值、拼接、比较不用操心长度。用它的代价是必须多写一行#includestring忘了这行就是编译错误这个坑几乎每个人都踩。还有一种叫转义字符的东西用来表示那些「打不出来」或「有特殊含义」的符号。常用的就三个#includeiostream using namespace std; int main() { cout \\ endl; // 输出一个反斜杠本身 cout Hello\tWorld endl; // \t 跳到下一个制表位做对齐用 cout 第一行\n第二行 endl; // \n 换行 system(pause); return 0; }为什么反斜杠要写两遍因为在 C 里单个反斜杠是「转义开关」\n表示换行、\t表示制表符你想输出反斜杠这个符号本身就得写\\告诉编译器「这个是真的反斜杠」。同理字符串里想输出双引号就写\。这类小符号平时不起眼等到你要输出文件路径的时候能让你排查半天。4.4 cin让程序从键盘拿到数据前面都是程序往外说cin是让它听你说。语法和cout正好反着来箭头方向朝变量#includeiostream #includestring using namespace std; int main() { int age 0; cout 请输入年龄 endl; cin age; // 从键盘读入一个整数塞进 age cout 你输入的是 age endl; string name; cout 请输入名字 endl; cin name; cout 你好 name endl; system(pause); return 0; }几个需要提前知道的点cin age会跳过开头的空格和换行读到不符合类型的字符就停如果用户输入了字母而你在读int读取会失败变量保持原值。入门阶段先不处理这种异常输入但心里要有个数真实程序里用户的输入永远比你想象的离谱。还有一个小坑cin读字符串时遇到空格就会停输入「张 三」只会拿到「张」。想读一整行带空格的文本要用另一套写法getline这个等你学到字符串处理时再深入现在知道有这回事就行。5. 新手避坑排查运算符里的坑和五个翻车现场有了变量和类型接下来就该算数了。这一章先把四类运算符过一遍重点是几个反直觉的地方然后把新手最容易翻车的场景集中列出来——这些坑我几乎每个都踩过提前知道能省下不少下午。5.1 四类运算符一遍过算数、赋值、比较、逻辑算术运算符就是四则运算加上取余、-、*、/、%。看着简单但有两个必须记住的规则。#includeiostream using namespace std; int main() { int a 10; int b 3; cout a b endl; // 13 cout a - b endl; // 7 cout a * b endl; // 30 cout a / b endl; // 3两个整数相除小数部分被直接丢掉 cout a % b endl; // 1取余数 double d1 10.0; double d2 4.0; cout d1 / d2 endl; // 2.5有小数参与才会保留小数 system(pause); return 0; }第一条两个整数相除结果还是整数10 / 3得到 3 而不是 3.33。这不是 bug是设计。想得到小数至少让其中一个操作数是浮点型比如10.0 / 3。第二条除数不能是 0整数除法除以 0 会直接让程序崩掉取余也一样。取余还有个限制只能用在整型上3.14 % 1.1是编译不过的。赋值运算符除了还有一批简写、-、*、/、%。a 2就是a a 2的缩写仅此而已没有更深的意思。它的价值在于少写一遍变量名减少手滑。比较运算符有、!、、、、结果是真或假用 1 和 0 表示。这里必须敲黑板判断相等是赋值是写错一个等号编译器有时候不报错但逻辑全歪。我见过太多人在这上面耗掉一晚上。逻辑运算符有三个!非、与、||或。记口诀就行!是真变假假变真是同真才为真||是同假才为假。#includeiostream using namespace std; int main() { int a 10; int b 0; cout (a b) endl; // 0因为 b 是假 cout (a || b) endl; // 1a 是真就够 cout !a endl; // 0非真即假 system(pause); return 0; }注意括号别省。cout a b这种写法会让编译器和输出符号打架加上括号最稳。5.2 前置 与后置 最容易记反的一对是自增让变量加 1。但它有前置和后置两种写法单独用的时候没区别一旦参与到表达式里结果就不同了。#includeiostream using namespace std; int main() { int a 10; a; // 等价于 a a 1 cout a endl; // 11 // 前置先加再参与计算 int a2 10; int b2 a2 * 10; // a2 先变成 11再乘 10 cout b2 b2 endl; // 110 // 后置先参与计算再加 int a3 10; int b3 a3 * 10; // 先用 10 乘 10然后 a3 才变 11 cout b3 b3 endl; // 100 system(pause); return 0; }记法很简单符号在前先动自己符号在后先干活后动自己。递减--的规则一模一样只是方向反着。这里给个实际建议除非你非常确定否则不要在同一行里对同一个变量既自增又使用。a a a这种写法在不同编译器下结果可能不一样属于自找麻烦。真需要拆开的时候就老老实实分两行写清晰永远比炫技重要。5.3 五个翻车现场现象、原因、解决下面这五条是新手阶段出现频率最高的问题我按「现象 → 原因 → 解决」的顺序写你可以当成一份排查清单收着。现象一编译报错提示「未声明的标识符」但我明明定义了。原因通常是拼写或大小写不一致cout写成Cout、count写成cout也可能变量定义在花括号里面你在括号外面用它。解决先看报错给的行号逐个核对拼写再确认这个变量是不是定义在另一个{}里。变量的有效范围就是从它定义处到所在花括号结束出了这个圈就不认识了这个概念叫作用域后面会反复遇到。现象二程序跑起来窗口一闪就没了什么都没看到。原因基本是末尾缺了system(pause);或者程序在你自己看到输出前就执行完了。解决把暂停那句加上位置放在return 0;之前。如果加了还是闪检查是不是写在了return 0;后面那样根本执行不到。现象三整数除法算出来不对10 除以 3 得到 3。原因不是算错了是两个整数相除小数部分被直接截断。解决把其中一个改成小数比如10.0 / 3或者把变量声明成double。这个坑在做平均分、百分比的时候特别容易撞上算出来永远是整数你还以为逻辑写错了。现象四判断条件怎么都不成立明明两个值一样。原因大概率是把写成了。if (a 1)是赋值赋值完这个表达式永远为真于是条件永远成立写成才是比较。解决养成习惯判断相等时把常量写在左边比如if (1 a)这样手滑写成编译器会直接报错属于给自己留后悔药。现象五改了代码运行结果还是旧的。这在 IDE 里挺常见原因可能是你改了文件但没保存或者运行的是上一次编译出来的旧程序。解决先确认保存标题栏有圆点或星号通常表示未保存再重新编译运行一次。如果你同时开了好几个项目还要确认运行的是不是当前这个选错项目是新手极容易忽略的低级事故。注意遇到报错先看第一行不要从最后一行往上读。编译器经常在第一个错误后面连带报出一串错误真正的原因往往只有最上面那一条。6. 下一步学什么从入门讲义走向核心与提高基础概念过完之后最怕的是不知道该往哪走于是今天看点视频、明天翻翻博客一个月下来还是只会写 Hello world。这条路我建议按顺序走每一段都配一个能跑起来的小东西别只看不写。第一段是把已学的东西用熟。变量、类型、运算符这些看着简单真正用起来才会暴露问题。你可以写一个「成绩计算器」输入三门课分数输出总分和平均分顺便练一下小数除法。或者写一个「找零程序」输入商品价格和付款金额输出该找多少钱。这类小程序二三十行但会把输入输出、类型转换、运算符全用一遍。第二段进入核心部分。按顺序大概是流程控制判断和循环、函数、数组、指针、结构体。这一步的难度会明显上一个台阶尤其是指针很多人在这里卡住。我的建议是每个概念都配一个能打印出结果的小例子指针就从「定义一个指针、打印它存的地址、打印它指向的值」这三行开始别一上来就想搞懂所有用法。第三段才是提高部分类与对象、封装继承多态、运算符重载、模板、异常处理。这些是 C 区别于很多语言的地方也是这份讲义笔记从入门讲到核心、再讲到提高的完整路径。到这一步你已经不需要别人告诉你下一步做什么了因为你会自己冒出想实现的东西。阶段主要内容阶段目标打地基变量、常量、类型、运算符、输入输出能独立写出几十行的小程序核心判断与循环、函数、数组、指针、结构体能读懂别人写的简单代码并改提高类与对象、继承与多态、模板、异常能组织稍大规模的程序结构最后给一个具体技巧每天写代码的时间不用长四十分钟就够但必须是自己敲出来的不是看视频看会的。看的时候觉得懂了手一停就全忘这是编程里最真实的体验。我刚开始学的时候图快看了三章就跳去写贪吃蛇结果连变量的作用域都没弄清楚一个变量在花括号外面用不了我盯着报错看了一下午才反应过来。从那以后我每次学新东西都强制自己把最小的那个例子先敲三遍再往下走敲完还得改一改参数看看结果怎么变。这习惯笨但真的管用。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?