9.19. 水平留白
总述
水平留白的使用根据在代码中的位置决定. 永远不要在行尾添加没意义的留白.
说明
通用
- void f(bool b) { // 左大括号前总是有空格.
- ...
- int i = 0; // 分号前不加空格.
- // 列表初始化中大括号内的空格是可选的.
- // 如果加了空格, 那么两边都要加上.
- int x[] = { 0 };
- int x[] = {0};
- // 继承与初始化列表中的冒号前后恒有空格.
- class Foo : public Bar {
- public:
- // 对于单行函数的实现, 在大括号内加上空格
- // 然后是函数实现
- Foo(int b) : Bar(), baz_(b) {} // 大括号里面是空的话, 不加空格.
- void Reset() { baz_ = 0; } // 用括号把大括号与实现分开.
- ...
添加冗余的留白会给其他人编辑时造成额外负担. 因此, 行尾不要留空格. 如果确定一行代码已经修改完毕, 将多余的空格去掉; 或者在专门清理空格时去掉(尤其是在没有其他人在处理这件事的时候). (Yang.Y 注: 现在大部分代码编辑器稍加设置后, 都支持自动删除行首/行尾空格, 如果不支持, 考虑换一款编辑器或 IDE)
循环和条件语句
- if (b) { // if 条件语句和循环语句关键字后均有空格.
- } else { // else 前后有空格.
- }
- while (test) {} // 圆括号内部不紧邻空格.
- switch (i) {
- for (int i = 0; i < 5; ++i) {
- switch ( i ) { // 循环和条件语句的圆括号里可以与空格紧邻.
- if ( test ) { // 圆括号, 但这很少见. 总之要一致.
- for ( int i = 0; i < 5; ++i ) {
- for ( ; i < 5 ; ++i) { // 循环里内 ; 后恒有空格, ; 前可以加个空格.
- switch (i) {
- case 1: // switch case 的冒号前无空格.
- ...
- case 2: break; // 如果冒号有代码, 加个空格.
操作符
- // 赋值运算符前后总是有空格.
- x = 0;
- // 其它二元操作符也前后恒有空格, 不过对于表达式的子式可以不加空格.
- // 圆括号内部没有紧邻空格.
- v = w * x + y / z;
- v = w*x + y/z;
- v = w * (x + z);
- // 在参数和一元操作符之间不加空格.
- x = -5;
- ++x;
- if (x && !y)
- ...
模板和转换
- // 尖括号(< and >) 不与空格紧邻, < 前没有空格, > 和 ( 之间也没有.
- vector<string> x;
- y = static_cast<char*>(x);
- // 在类型与指针操作符之间留空格也可以, 但要保持一致.
- vector<char *> x;