C++ 注释://、/* */ 和专业写法
一句话:// 注释掉本行剩余部分;/* ... */ 注释掉标记之间的一切,可以跨行。编译器在开工前就把两者都扔掉 — 下面有证明。
#include <iostream>
using namespace std;
// 这行注释解释整个程序。编译器无视它。
/* 块注释可以横跨
需要的任意多行。 */
int main() {
cout << "comments are ignored" << endl; // 行尾注释
// cout << "这一行不会运行";
return 0;
}
输出证明了这一点:被注释的行不产生代码、不产生输出、不产生开销。注释是给人看的交流工具 — 而交流大多注定是废话。
两种形式
| 形式 | 作用范围 | 典型用途 |
|---|---|---|
// 行注释 | 到行尾 | 解释某一行或某个决定 — 日常默认 |
/* 块 */ | 直到配对的 */ | 临时禁用一段代码、文件头说明 |
陷阱:块注释不嵌套
/*
想禁用这段调试代码……
/* 内层注释 */ ← 块在这里就结束了!
cout << "这行没被注释"; // ← 惊喜,它是活代码
*/ // ← 多余的 */ — 语法错误
第一个 */ 就会关闭块,不管开了多少个 /*。这就是"用块注释临时禁代码"会以离谱方式翻车的原因。临时禁代码请用 #if 0 … #endif(它可嵌套),或者干脆删掉 — 版本控制记得。
好注释和噪音的分界线
- 好:解释为什么,不是做什么。
// 重试:该 API 会限制突发请求告诉下一位读者代码说不出的事。// 给 i 加一只是把那行代码念一遍。 - 好:标注意图与取舍。
// O(n²),但这里 n ≤ 100 — 没问题提前掐灭一次没必要的"优化"PR。 - 坏:留下被注释掉的代码。它会腐烂、挡路,而版本控制里永远找得回来。
- 坏:撒谎的注释。和代码打架的注释比没有注释更糟 — 改代码时,同一口气里改掉或删掉它的注释。
- 值得认识的约定:
// TODO:计划中的活,// FIXME:已知的坏,///文档注释(Doxygen 等工具用它生成文档)。
注释的面试角度
- "注释影响性能吗?" — 不;编译前就被剥掉。零运行期成本,编译期成本可忽略。
- "块注释能嵌套吗?" — 不能;第一个
*/说了算(见上文)。出镜率惊人的筛选题。 - "什么是文档注释?" —
///风格的标注,文档生成器把它变成参考文档;公共 API 的标准做法。 - "一个 300 行没有注释的 diff 你怎么审?" — 题背后的真问题是:代码解释了自己的为什么吗?命名能扛一部分;注释扛命名扛不动的部分。
练习
- 跑上面的例子,然后把正在工作的
cout注释掉、被注释的那行放开 — 不改任何"真代码",让程序输出反转。 - 弄坏它:在
return 0;前放一个/*且不闭合 — 读一读编译器对"意外文件结束"的抱怨(它和我们常见错误指南里的某条是亲戚)。 - 去做1 到 N 求和,只写一条注释:你循环边界的"为什么"。
相关:Hello World 一课(注释首次登场)、什么是 int main()、while 循环详解。