必须加{},因编译器仅将循环关键字后首行语句视为循环体,后续增逻辑或调缩进易致隐蔽bug。

要加,强烈建议始终加上大括号,哪怕循环体只有一句。
为什么单行 for/while 也必须加 {}
语法上允许省略,但编译器只把紧贴在循环关键字后面、没有分号隔开的**第一行语句**当作循环体。一旦后续加了新逻辑,或只是调整缩进,就极易引入隐蔽 bug。比如:
for (int i = 0; i < 3; ++i)
std::cout << i << " ";
sum += i; // 这行根本不在循环里!i 在循环外已不可见,且 sum 不会累加三次
这种错误不会报错,但结果完全不对——sum 只执行一次,且可能因 i 作用域问题编译失败。
不加大括号在哪些场景下会出问题
-
if和循环嵌套时:省略{}会导致else绑定到最近的if,而非你视觉上认为的那个 - 代码维护阶段:别人(或未来的你)想在循环里加日志、条件判断或资源操作,没括号就得先补括号再改,容易漏掉或格式错乱
- 静态分析工具(如 clang-tidy)默认警告
cppcoreguidelines-pro-bounds-for-range类规则,不加括号直接被标为 style violation - 团队协作中,主流 C++ 风格指南(Google、Microsoft、ISO C++ Core Guidelines)全部明确要求:任何控制结构的语句块都必须使用
{}
实际写法对比:加 vs 不加
推荐写法(清晰、安全、可扩展):
立即学习“C++免费学习笔记(深入)”;
for (int i = 0; i < n; ++i) {
process(data[i]);
}
不推荐写法(看似简洁,实则脆弱):
for (int i = 0; i < n; ++i)
process(data[i]);
注意:process(data[i]) 是单行,但一旦某天需要加错误检查:
for (int i = 0; i < n; ++i) {
if (data[i].valid()) {
process(data[i]);
}
}
——这个改动在有括号基础上是自然演进;若原来没括号,就得先定位、补括号、再缩进,多一步就多一个出错机会。
真正容易被忽略的不是“要不要加”,而是“加了之后是否保持作用域最小化”——比如把 int i 放在 for 初始化中,而不是提前声明在外部,避免变量污染和误用。


















