Hello World 深入理解
在第一个程序中,我们已经写过Hello World了。这一节我们深入理解它的每个细节。
回顾代码
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
程序执行过程
让我们看看这个程序在计算机中是如何运行的:
graph LR
A[源代码 hello.c] --> B[预处理器]
B --> C[编译器]
C --> D[汇编器]
D --> E[链接器]
E --> F[可执行文件 hello.exe]
F --> G[运行程序]
1. 预处理(Preprocessing)
预处理器会处理以 # 开头的指令:
#include <stdio.h> // 预处理器会把stdio.h的内容复制到这里
2. 编译(Compilation)
编译器把C代码翻译成汇编语言。
3. 汇编(Assembly)
汇编器把汇编语言翻译成机器码。
4. 链接(Linking)
链接器把所有代码和库文件连接在一起,生成可执行文件。
深入 printf
printf 是最常用的函数之一,让我们深入了解它。
基本用法
printf("要打印的内容");
打印不同内容
#include <stdio.h>
int main() {
// 打印文本
printf("Hello, World!\n");
// 打印数字(后面会详细讲)
printf("我今年 18 岁\n");
// 打印空行
printf("\n");
// 连续打印
printf("第一部分");
printf("第二部分\n"); // 输出:第一部分第二部分
return 0;
}
转义字符详解
转义字符让我们能打印特殊字符:
#include <stdio.h>
int main() {
// 换行
printf("第一行\n第二行\n");
// 制表符(Tab)
printf("姓名\t年龄\t城市\n");
printf("小明\t18\t北京\n");
// 打印引号
printf("他说:\"你好!\"\n");
// 打印反斜杠
printf("文件路径:C:\\Program Files\\App\n");
// 退格
printf("1234\b5\n"); // 输出:1235(4被删除)
// 回车(移到行首)
printf("Hello\rWorld\n"); // 输出:World(Hello被覆盖)
return 0;
}
常用转义字符表:
| 转义字符 | 含义 | ASCII码 | 示例输出 |
|---|---|---|---|
\n | 换行 | 10 | 光标移到下一行 |
\t | 水平制表符 | 9 | 像按Tab键 |
\\ | 反斜杠 | 92 | \ |
\" | 双引号 | 34 | " |
\' | 单引号 | 39 | ' |
\r | 回车 | 13 | 光标移到行首 |
\b | 退格 | 8 | 删除前一个字符 |
\0 | 空字符 | 0 | 字符串结束符 |
注释的艺术
注释是给人看的,不会被执行。
单行注释
// 这是单行注释
int main() {
printf("Hello\n"); // 在代码后面也可以写注释
// printf("这行不会执行\n");
return 0;
}
多行注释
/*
* 这是多行注释
* 可以写很多行
* 用于详细说明
*/
int main() {
printf("Hello\n");
/* 这样也可以 */
/*
printf("注释掉的代码\n");
printf("不会执行\n");
*/
return 0;
}
注释的好习惯
#include <stdio.h>
// 程序功能:打印个人信息
// 作者:小明
// 日期:2024-01-01
int main() {
// 打印欢迎信息
printf("=== 个人信息 ===\n");
// 打印姓名
printf("姓名:小明\n");
// 打印年龄
printf("年龄:18\n");
return 0; // 程序正常结束
}
💡 注释建议
- ✅ 解释"为什么"这样做,而不是"做了什么"
- ✅ 复杂逻辑一定要写注释
- ❌ 不要写废话注释:
i = i + 1; // i加1 - ❌ 不要注释掉大段代码,应该删除
代码风格
良好的代码风格让代码更易读。
缩进
// ✅ 好的缩进
int main() {
printf("第一行\n");
printf("第二行\n");
return 0;
}
// ❌ 不好的缩进
int main() {
printf("第一行\n");
printf("第二行\n");
return 0;
}
空格
// ✅ 好的空格使用
int main() {
int a = 10;
int b = 20;
int sum = a + b;
return 0;
}
// ❌ 不好的空格使用
int main(){
int a=10;
int b=20;
int sum=a+b;
return 0;
}
命名规范
// ✅ 好的命名
int studentAge; // 驼峰命名
int student_age; // 下划线命名
int MAX_SIZE; // 常量用大写
// ❌ 不好的命名
int a; // 太简短
int xueshengAge; // 不要用拼音
int Age; // 变量不要大写开头
实战练习
练习1:打印个人名片
要求打印:
╔═══════════════════════╗
║ 个人名片 ║
╠═══════════════════════╣
║ 姓名:张三 ║
║ 年龄:20 ║
║ 职业:程序员 ║
║ 邮箱:zhangsan@qq.com ║
╚═══════════════════════╝
查看答案
#include <stdio.h>
int main() {
printf("╔═══════════════════════╗\n");
printf("║ 个人名片 ║\n");
printf("╠═══════════════════════╣\n");
printf("║ 姓名:张三 ║\n");
printf("║ 年龄:20 ║\n");
printf("║ 职业:程序员 ║\n");
printf("║ 邮箱:zhangsan@qq.com ║\n");
printf("╚═══════════════════════╝\n");
return 0;
}
练习2:打印ASCII艺术
打印一个笑脸:
*****
* *
* O O *
* ^ *
* \___/ *
* *
*****
练习3:打印课程表
时间 周一 周二 周三
08:00 语文 数学 英语
10:00 数学 体育 语文
14:00 英语 语文 数学
小测验
以下哪个是正确的注释?
A. // 这是注释 B. /* 这是注释 */ C. <!-- 这是注释 --> D. # 这是注释\n表示什么?A. 字母n B. 换行 C. Tab D. 空格以下哪个会报错?
A. printf("Hello"); B. printf("Hello\n"); C. printf('Hello\n'); D. printf("He said \"Hi\"");
查看答案
- A和B都对(C是HTML注释,D是预处理指令)
- B(换行)
- C(应该用双引号,不是单引号)
下一步
现在你已经完全理解Hello World了!接下来学习变量。
👉 变量详解