C++ 注释://、/* */ 和专业写法

一句话:// 注释掉本行剩余部分;/* ... */ 注释掉标记之间的一切,可以跨行。编译器在开工前就把两者都扔掉 — 下面有证明。

#include <iostream>
using namespace std;

// 这行注释解释整个程序。编译器无视它。

/* 块注释可以横跨
   需要的任意多行。 */

int main() {
    cout << "comments are ignored" << endl;  // 行尾注释
    // cout << "这一行不会运行";
    return 0;
}

输出证明了这一点:被注释的行不产生代码、不产生输出、不产生开销。注释是给人看的交流工具 — 而交流大多注定是废话。

两种形式

形式作用范围典型用途
// 行注释到行尾解释某一行或某个决定 — 日常默认
/* 块 */直到配对的 */临时禁用一段代码、文件头说明

陷阱:块注释不嵌套

/*
  想禁用这段调试代码……
  /* 内层注释 */    ← 块在这里就结束了!
  cout << "这行没被注释";   // ← 惊喜,它是活代码
*/                        // ← 多余的 */ — 语法错误

第一个 */ 就会关闭块,不管开了多少个 /*。这就是"用块注释临时禁代码"会以离谱方式翻车的原因。临时禁代码请用 #if 0 … #endif(它可嵌套),或者干脆删掉 — 版本控制记得。

好注释和噪音的分界线

注释的面试角度

  1. "注释影响性能吗?" — 不;编译前就被剥掉。零运行期成本,编译期成本可忽略。
  2. "块注释能嵌套吗?" — 不能;第一个 */ 说了算(见上文)。出镜率惊人的筛选题。
  3. "什么是文档注释?" — /// 风格的标注,文档生成器把它变成参考文档;公共 API 的标准做法。
  4. "一个 300 行没有注释的 diff 你怎么审?" — 题背后的真问题是:代码解释了自己的为什么吗?命名能扛一部分;注释扛命名扛不动的部分。

练习

相关:Hello World 一课(注释首次登场)、什么是 int main()、while 循环详解。