9.19. 水平留白

总述

水平留白的使用根据在代码中的位置决定. 永远不要在行尾添加没意义的留白.

说明

通用

  1. void f(bool b) { // 左大括号前总是有空格.
  2. ...
  3. int i = 0; // 分号前不加空格.
  4. // 列表初始化中大括号内的空格是可选的.
  5. // 如果加了空格, 那么两边都要加上.
  6. int x[] = { 0 };
  7. int x[] = {0};
  8.  
  9. // 继承与初始化列表中的冒号前后恒有空格.
  10. class Foo : public Bar {
  11. public:
  12. // 对于单行函数的实现, 在大括号内加上空格
  13. // 然后是函数实现
  14. Foo(int b) : Bar(), baz_(b) {} // 大括号里面是空的话, 不加空格.
  15. void Reset() { baz_ = 0; } // 用括号把大括号与实现分开.
  16. ...

添加冗余的留白会给其他人编辑时造成额外负担. 因此, 行尾不要留空格. 如果确定一行代码已经修改完毕, 将多余的空格去掉; 或者在专门清理空格时去掉(尤其是在没有其他人在处理这件事的时候). (Yang.Y 注: 现在大部分代码编辑器稍加设置后, 都支持自动删除行首/行尾空格, 如果不支持, 考虑换一款编辑器或 IDE)

循环和条件语句

  1. if (b) { // if 条件语句和循环语句关键字后均有空格.
  2. } else { // else 前后有空格.
  3. }
  4. while (test) {} // 圆括号内部不紧邻空格.
  5. switch (i) {
  6. for (int i = 0; i < 5; ++i) {
  7. switch ( i ) { // 循环和条件语句的圆括号里可以与空格紧邻.
  8. if ( test ) { // 圆括号, 但这很少见. 总之要一致.
  9. for ( int i = 0; i < 5; ++i ) {
  10. for ( ; i < 5 ; ++i) { // 循环里内 ; 后恒有空格, ; 前可以加个空格.
  11. switch (i) {
  12. case 1: // switch case 的冒号前无空格.
  13. ...
  14. case 2: break; // 如果冒号有代码, 加个空格.

操作符

  1. // 赋值运算符前后总是有空格.
  2. x = 0;
  3.  
  4. // 其它二元操作符也前后恒有空格, 不过对于表达式的子式可以不加空格.
  5. // 圆括号内部没有紧邻空格.
  6. v = w * x + y / z;
  7. v = w*x + y/z;
  8. v = w * (x + z);
  9.  
  10. // 在参数和一元操作符之间不加空格.
  11. x = -5;
  12. ++x;
  13. if (x && !y)
  14. ...

模板和转换

  1. // 尖括号(< and >) 不与空格紧邻, < 前没有空格, > 和 ( 之间也没有.
  2. vector<string> x;
  3. y = static_cast<char*>(x);
  4.  
  5. // 在类型与指针操作符之间留空格也可以, 但要保持一致.
  6. vector<char *> x;