程序设计入门 — C 语言
老师:“C语言是编程之母,学好了它,其他语言都是弟弟!”
我:“好好好,母上大人好!”(内心OS:母上大人怎么连个
Hello World
都写不利索?)
第一周 程序设计与 C 语言
本周目标:从编程小白进阶成“能写出
Hello World
但会被自己蠢哭”的菜鸟。
6 第一个程序 HelloWord
📝6.1 C 语言笔记 | 分三步实现第一个程序 Hello World
(适合刚接触编程的小白,像学学姐手把手教学一样!😎)
🚀 第一步:创建文件
选工具:
- 推荐用 VS Code(免费轻量)或 Visual Studio 2022(集成编译),记事本也行但没高亮。
- ❌ 不要用Word!会乱码!
建文件(以 Visual Studio 2022 为例):
- 点击创建新项目 。
- 点击控制台应用后,点击下一步。
- 项目名称改为
HelloWord
- 位置按自己喜好修改。
- 点击创建。
- 将原始文件删除并添加新文件。
图片步骤如下:
🖋️ 第二步:编写代码
敲代码:
#include<stdio.h> // 1. 导入头文件(必须第一行!) int main() { // 2. 主函数入口(程序从这里开始跑) printf("Hello World!\n"); // 3. 输出语句(\n是换行) return 0; // 4. 返回0表示程序正常结束 }
避坑指南:
- 🚨 报错
printf
未声明?→ 忘记加#include <stdio.h>
。 - 🚨 报错
expected ';' before '}'
?→ 漏了分号;
(每行结尾都要有!)。 - 🚨 中文乱码?→ 检查编码是否为UTF-8,或暂时改用英文输出。
- 🚨 报错
▶️ 第三步:运行代码
1.保存文件:
- 按
CTRL + S
2.运行文件:
- 按
CTRL + F5
3.结果如图所示:
📌本节总结:
- 🔧 框架思维:先写
main()
骨架,再填内容,像搭积木一样。 - 🔍 细节控:C语言对标点敏感,分号、括号、引号一个都不能错!
- 💪 多动手:照着敲一遍,比看10遍视频管用!
下节预告:Hello World
代码深度解析!🚀
(PS:第一次运行成功时,有没有觉得超有成就感?😎)
📝6.2 C 语言笔记 | Hello World 代码深度解析
(适合已写过第一个程序,想彻底搞懂每行代码含义的同学~)
🔍 代码逐行解剖
#include <stdio.h> // 📚 头文件:程序的“工具箱”
int main() { // 🚀 主函数:程序入口点
printf("Hello World!\n"); // 🖨️ 输出语句:向屏幕打印内容
return 0; // ✅ 返回值:告诉系统程序正常结束
}
📚 1. #include <stdio.h>
—— 头文件导入
- 作用:引入标准输入输出库,让程序能用
printf
(打印)、scanf
(输入)等功能。 - 类比:像做菜前要准备好调料(头文件),没有它,
printf
这类“调料”就用不了。 - 扩展:C 语言所有功能都分散在头文件中,比如数学函数在
<math.h>
,字符串操作在<string.h>
。
🚀 2. int main()
—— 主函数
结构:
int main() { // int 表示函数返回一个整数 // 代码逻辑 return 0; // 必须返回整数,0通常表示成功 }
关键点:
- 所有C程序必须有一个
main
函数,且只能有一个。 int
表示函数会返回一个整数值给操作系统(0成功,非0表示错误代码)。- 花括号
{}
包裹的代码块是函数的“身体”,按顺序执行。
- 所有C程序必须有一个
🖨️ 3. printf("Hello World!\n");
—— 输出语句
- 作用:向控制台打印文本内容。
- 细节:
printf
是 “print formatted” 的缩写,支持格式化输出(如%d
输出整数)。\n
是转义字符,表示换行(不写的话,后续输出会紧接在这一行后面)。- 字符串必须用英文双引号
""
,结尾必须有分号;
(C语言语句结束标志)。
- 常见错误:
- 拼写错误:
pritnf
→ 编译器会报错“未声明标识符”。 - 漏分号:
printf("...")
→ 报错“expected ‘;’ before ‘}’”。
- 拼写错误:
✅ 4. return 0;
—— 返回值
- 作用:告诉操作系统程序执行结果。
- 规则:
main
函数必须返回int
类型值,0
表示成功,非0值(如1
)表示异常退出。- 在 C99 及之后的标准中,如果
main
函数末尾省略return 0;
,编译器会自动补充。
💡 代码执行流程
- 程序从
main
函数开始执行。 - 执行
printf
输出内容。 - 执行
return 0
结束程序,返回值0
告诉系统“一切正常”。
🔧 修改代码实验
实验1:改输出内容
#include<stdio.h> int main() { printf("Hello C语言!\n"); // 输出:Hello C语言! return 0; }
实验2:去掉
\n
#include<stdio.h> int main() { printf("Hello World!"); // 输出:Hello World!(光标停在行尾不换行) return 0; }
📌本节总结:
- 🔍 细节决定成败:C语言对符号(分号、引号、括号)极其敏感,漏一个就会报错。
- 🧠 流程思维:程序是按代码顺序从上到下执行的,理解流程才能调试错误。
- 💻 动手实践:改一行代码、删一个符号,看看报错信息,比背语法更有效!
下节预告: Hello World 文件执行流程深度解析 🚀
📝6.3 C 语言笔记 | Hello World 文件执行流程深度解析
🔍 代码执行流程:从编写到运行的完整生命周期
#include <stdio.h> // 📚 头文件:程序的“工具箱”
int main() { // 🚀 主函数:程序入口点
printf("Hello World!\n"); // 🖨️ 输出语句:向屏幕打印内容
return 0; // ✅ 返回值:告诉系统程序正常结束
}
🔧 执行流程分步解析
- 预处理阶段(Preprocessing)
- 操作:编译器首先处理
#include <stdio.h>
,将标准输入输出库的代码“复制”到当前文件中。 - 作用:相当于给程序配备“工具箱”,使
printf
等函数可用。 - 细节:
- 头文件本质是代码的“集合包”,
stdio.h
包含了输入输出函数的声明。 - 预处理后的文件会变得“臃肿”,因为嵌入了大量库代码。
- 头文件本质是代码的“集合包”,
- 操作:编译器首先处理
- 编译阶段(Compilation)
- 操作:将预处理后的代码翻译为汇编语言(Assembly)。
- 作用:将人类可读的C代码转为机器能理解的底层指令。
- 细节:
printf("Hello World!\n");
会被翻译为类似mov
(数据移动)、call
(函数调用)的指令。- 生成
.s
或.asm
文件(但通常隐藏,直接进入下一步)。
- 汇编阶段(Assembly)
- 操作:将汇编代码转换为二进制目标文件(
.o
或.obj
)。 - 作用:生成机器码,但此时程序仍是一个“半成品”(缺少外部依赖)。
- 类比:像组装电脑主板,但显卡(
printf
的实现)还未安装。
- 操作:将汇编代码转换为二进制目标文件(
- 链接阶段(Linking)
- 操作:链接器将目标文件与标准库(如
printf
的实现)合并,生成可执行文件(.exe
或.out
)。 - 关键点:
- 解决函数调用地址问题(如
printf
的具体位置)。 - 生成最终的可执行程序,此时程序已“完整”。
- 解决函数调用地址问题(如
- 操作:链接器将目标文件与标准库(如
- 执行阶段(Execution)
- 操作:操作系统加载可执行文件到内存,从
main
函数开始执行。 - 流程:
- 执行
printf
,输出Hello World!
并换行。 - 执行
return 0
,告诉操作系统程序正常结束。
- 执行
- 细节:
- 若省略
return 0
,C99 及之后标准会自动补充,但显式写出更规范。 - 程序结束后,操作系统回收资源,控制权交还用户。
- 若省略
- 操作:操作系统加载可执行文件到内存,从
🔍 流程图解
编写代码 → 预处理(包含头文件) → 编译(转汇编) → 汇编(转二进制) → 链接(合并库) → 执行(运行程序)
🔧 修改代码实验
实验1:改输出内容
#include<stdio.h> int main() { printf("Hello C语言!\n"); // 输出:Hello C语言! return 0; }
- 结果:控制台显示
Hello C语言!
(程序会说中文了!)。
- 结果:控制台显示
实验2:去掉
\n
#include<stdio.h> int main() { printf("Hello World!"); // 输出:Hello World!(光标停在行尾不换行) return 0; }
- 结果:输出
Hello World!
后不换行,下次输出会紧接在后面(像排队不换行)。
- 结果:输出
实验3:省略
return 0
#include<stdio.h> int main() { printf("Hello World!\n"); // 省略 return 0; }
- 结果:程序仍能运行,但部分编译器会警告“not all control paths return a value”(非所有路径都返回值)。在C99及之后标准中,
main
函数末尾省略return 0
会被自动补充。
- 结果:程序仍能运行,但部分编译器会警告“not all control paths return a value”(非所有路径都返回值)。在C99及之后标准中,
📌 本节总结:
- 🔍 流程为王:理解预处理、编译、汇编、链接、执行五步流程,比死记语法更重要。
- 🧠 细节决定成败:C语言对符号(分号、引号、括号)极其敏感,漏一个就会报错。
- 💻 动手实践:改一行代码、删一个符号,看看报错信息,比背语法更有效!
下节预告:注释的基本使用 🚀