Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >编程规范 写 if 语句不要任性

编程规范 写 if 语句不要任性

作者头像
twowinter
发布于 2020-04-17 06:45:21
发布于 2020-04-17 06:45:21
2.2K00
代码可运行
举报
文章被收录于专栏:twowintertwowinter
运行总次数:0
代码可运行

在之前的文章编程规范_这个星球上最好的C编程风格中,介绍了猿届的辟邪剑谱,哦不,是独孤九剑,Google C++ Style Guide。编程规范而已,用不着自宫。为了方便大家,我也专门挑出了C语言相关的部分,并且翻译成了中文,放在我的github上。

本文首发于微信公众号twowinter,转载请注明作者:http://blog.csdn.net/iotisan/

点此进入公众号查看。


程序执行都是由各种各样的语句组成,最常见的有表达式语句和函数调用语句,以及控制语句等。据统计,全世界的程序语句中,条件语句的比例高达67.3%,循环语句也有36.5%。不要问我这个数据怎么得到的,通常开篇都要开个玩笑,好让大家有兴趣把文章看下去。

表达式语句和函数调用很简单,都只有一行,因此只要编程规范上注意下缩进就好。控制语句的花样就多一点,也就是大家最常用的条件语句、循环语句语句。如果不加注意,就会遇到各种样式的ifelse。

我在编程规范_这个星球上最好的C编程风格提到的“几位前辈用连括号前一个空格都不放过的严谨让我受益匪浅”,讲的是关于if语句圆括号与左大括号的空格。很谢谢当时遇到的前辈,这情景现在还印象深刻。

我们团队并没有强制执行这个格式规范,因此就遇到了这样的困扰。于是今天抽空梳理了下,希望大家在平常刻意练习,相互督促,形成一个好的团队编程氛围。

这些都在谷歌C++编程规范的‘格式’章节中,前文编程规范入门篇 空格和tab的区别也是出自这个章节。

1 条件语句

提倡不在圆括号中添加空格,关键字else另起一行。 对基本条件语句有两种可以接受的格式,一种在圆括号和条件之间有空格,一种没有。 最常见的是没有空格的格式,那种都可以,还是一致性为主。如果你是在修改一个文件,参考当前已有格式;如果是写新的代码,参考目录下或项目中其他文件的格式,还在徘徊的话,就不要加空格了。

代码语言:javascript
代码运行次数:0
复制
if (condition) { // no spaces inside parentheses
... // 2 space indent.
} else { // The else goes on the same line as the closing brace.
...
}

如果你倾向于在圆括号内部加空格:

代码语言:javascript
代码运行次数:0
复制
if ( condition ) { // spaces inside parentheses - rare
... // 2 space indent.
} else { // The else goes on the same line as the closing brace.
...
}

注意所有情况下if和左圆括号间有个空格,右圆括号和左大括号(如果使用的话)间也要有个空格:

代码语言:javascript
代码运行次数:0
复制
if(condition) // Bad - space missing after IF.
if (condition){ // Bad - space missing before {.
if(condition){ // Doubly bad.

if (condition) { // Good - proper space after IF and before {.

有些条件语句写在同一行以增强可读性,只有当语句简单并且没有使用else子句时使用:

代码语言:javascript
代码运行次数:0
复制
if (x == kFoo) return new Foo();
if (x == kBar) return new Bar();

如果语句有else分支是不允许的:

代码语言:javascript
代码运行次数:0
复制
// Not allowed - IF statement on one line when there is an ELSE clause
if (x) DoThis();
else DoThat();

通常,单行语句不需要使用大括号,如果你喜欢也无可厚非,也有人要求if必须使用大括号:

代码语言:javascript
代码运行次数:0
复制
if (condition)
  DoSomething(); // 2 space indent.

if (condition) {
  DoSomething(); // 2 space indent.
}

但如果语句中哪一分支使用了大括号的话,其他部分也必须使用:

代码语言:javascript
代码运行次数:0
复制
// Not allowed - curly on IF but not ELSE
if (condition) {
  foo;
} else
  bar;

// Not allowed - curly on ELSE but not IF
if (condition)
  foo;
else {
  bar;
}

// Curly braces around both IF and ELSE required because
// one of the clauses used braces.
if (condition) {
  foo;
} else {
  bar;
}

2 条件语句实际案例分享

以团队伙伴新鲜出炉的代码为例。

代码语言:javascript
代码运行次数:0
复制
if(GetCadOrRxStateSwitchflag() ==0)
{
    SetCadOrRxStateSwitchflag(1);
}

按照谷歌规范需要做如下修改,我用^号来表示要添加的空格:

代码语言:javascript
代码运行次数:0
复制
if^(GetCadOrRxStateSwitchflag() ==^0)^{
    SetCadOrRxStateSwitchflag(1);
}

这里要说明下,除了指针和地址操作符外,其余的操作符的前后都要加空格,因此 ==^0,这边要有个空格。

3 switch选择语句

switch语句可以使用大括号分块;空循环体应使用{}或continue。 switch语句中的case块可以使用大括号也可以不用,取决于你的喜好,使用时要依下文所述。 如果有不满足case枚举条件的值,要总是包含一个default(如果有输入值没有case去处理,编译器将报警)。如果default永不会执行,可以简单的使用assert:

代码语言:javascript
代码运行次数:0
复制
    switch (var) {
      case 0: {  // 2 space indent
        ...      // 4 space indent
        break;
      }
      case 1: {
        ...
        break;
      }
      default: {
        assert(false);
      }
    }

4 switch选择语句案例分享

最近似乎没看到特别的switch,暂且不写。

5 循环语句

单句声明的循环体中,括号是可选的。

代码语言:javascript
代码运行次数:0
复制
    for (int i = 0; i < kSomeNumber; ++i)
      printf("I love you\n");

    for (int i = 0; i < kSomeNumber; ++i) {
      printf("I take it back\n");
    }

空循环,要用括号或者continue,而不能直接用个分号。

代码语言:javascript
代码运行次数:0
复制
    while (condition) {
      // Repeat test until it returns false.
    }
    for (int i = 0; i < kSomeNumber; ++i) {}  // Good - empty body.
    while (condition) continue;  // Good - continue indicates no logic.

    while (condition);  // Bad - looks like part of do/while loop.

6 循环语句实际案例分享

代码语言:javascript
代码运行次数:0
复制
for(i=0;i<length;i++)
SPICmd8bit(ptr[i]); 

注意对比下,这里有好几个空格要加,实际完成效果如下。

代码语言:javascript
代码运行次数:0
复制
for (i = 0; i < length; i++) {
    SPICmd8bit(ptr[i]);
}

虽然谷歌规范说括号是单句声明的循环体,括号是可选的。但是我觉得还是加个括号括起来比较好,万一别人要再加个循环内的语句,忘记加括号就容易发生事故。你加了括号,别人还更省心,可以直接填语句。

End

好了,就是这点小细节,再见。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言编程规范 clean code
规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。参考该规范之前,希望您具有相应的C语言基础能力,而不是通过该文档来学习C语言。
C语言与CPP编程
2021/03/10
5.7K0
C++编码格式建议
每个人都可能有自己的代码风格和格式,但如果一个项目中的所有人都遵循同一风格的话,这个项目就能更顺利地进行。每个人未必能同意下述的每一处格式规则,而且其中的不少规则需要一定时间的适应,但整个项目服从统一的编程风格是很重要的,只有这样才能让所有人轻松地阅读和理解代码。
恋喵大鲤鱼
2018/08/06
1.5K0
Google C++ 编程风格指南(八):格式
代码风格和格式确实比较随意, 但一个项目中所有人遵循同一风格是非常容易的. 个体未必同意下述每一处格式规则, 但整个项目服从统一的编程风格是很重要的, 只有这样才能让所有人能很轻松的阅读和理解代码.
CPP开发前沿
2022/03/03
1.7K0
Linux 命令(243)—— indent 命令
文章目录 1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 1.命令简介 indent 通过插入或删除空格来改变 C 代码文件的外观。 indent 可以格式化 C 代码文件,以方便程序员阅读、修改等操作。 2.命令格式 indent [options] [input-files] indent [options] [single-input-file] [-o output-file] indent --version 3.选项说明 -bad, --blank-lines-after-de
恋喵大鲤鱼
2023/01/13
6960
Kotlin 编码规约
如需根据本风格指南配置 IntelliJ 格式化程序,请安装 Kotlin 插件1.2.20 或更高版本,转到“Settings | Editor | Code Style | Kotlin”,点击右上角的“Set from...”链接,并从菜单中选择“Predefined style / Kotlin style guide”。
一个会写诗的程序员
2019/07/26
3.2K0
Kotlin 编码规约
JavaScript 编程规范(二)
1. 总是使用 const 或 let 来声明变量。 不这样做会导致产生全局变量。 我们希望避免污染全局命名空间。
桃翁
2019/03/18
1.6K0
C++打怪 之 编程风格指南 V1.0
C++用法很多,包容性也比较强。一个C++的工程可能包含了各种各样没见过的用法。本篇内容主要是参照谷歌C++标准规范,结合自身实际工作 及经验,整理一份适合平时C++开发的规则,规范自身C++编程规范。详细内容可参考《Google C++风格指南》。
开源519
2021/01/27
1.3K0
前端代码规范(es6,eslint,vue)
为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,这样能够确保在每个浏览器中拥有一致的展现。
山河木马
2019/03/05
6K0
前端代码规范(es6,eslint,vue)
JavaScript Standard Style(JS Standard 代码风格规则详解)
现在所有流行的代码压缩器都是通过 AST 压缩,因此它们在处理没有分号的 JavaScript 代码时没有问题(因为 JavaScript 不是必须使用分号)。
FungLeo
2019/05/26
2.6K0
JavaScript企业级编程规范(3)-换行与缩进-空格约束-语句格式-常见技巧
换行按照以下约束进行行缩进控制:函数参数换行。换行后的第一个参数的首字母应该和函数第一个参数的首字母左对齐,如下所示
itclanCoder
2020/10/28
1.7K0
JavaScript企业级编程规范(3)-换行与缩进-空格约束-语句格式-常见技巧
Go 控制结构篇:条件语句、分支语句、循环语句和跳转语句
流程控制主要用于设定计算执行的次序,建立程序的逻辑结构。Go 语言的流程控制和其他编程语言类似,支持如下几种流程控制语句:
学院君
2023/03/03
1.5K0
Go 控制结构篇:条件语句、分支语句、循环语句和跳转语句
值得一看:老外的嵌入式编程规范
作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。
AI 电堂
2021/07/02
1.2K0
JavaScript 编程规范(一)
eslint: object-shorthand jscs: requireEnhancedObjectLiterals
桃翁
2019/03/17
1.8K0
JavaScript 编程规范(一)
手把手教你在vue-cli3中配置eslint
vue-cli3按照官网教程配置搭建后,发现每次编译,eslint都抛出错误 error: Expected indentation of 4 spaces but found 0 (indent) at src\views\User.vue:26:1: 1 error found. 1 error potentially fixable with the `--fix` option. You may use special comments to disable some warnin
前端老鸟
2019/09/12
4.6K0
关于eslint使用规则,和各种报错对应规则。
ESLint 由 JavaScript 红宝书 作者 Nicholas C. Zakas 编写, 2013 年发布第一个版本。 NCZ 的初衷不是重复造一个轮子,而是在实际需求得不到 JSHint 团队响应 的情况下做出的选择:以可扩展、每条规则独立、不内置编码风格为理念编写一个 lint 工具。
双愚
2018/05/09
8.8K0
ESLint配置信息完整版
##ESLint配置信息完整版 #####说明: "no-undef": 0,和"no-undef": 'off',一样,表示关闭该功能 "no-undef": 1, 表示仅提示 "no-undef": 2, 表示报错 ####配置信息(来自网络) “no-alert”: 0,//禁止使用alert confirm prompt “no-array-constructor”: 2,//禁止使用数组构造器 “no-bitwise”: 0,//禁止使用按位运算符 “no-caller”: 1,//禁止使用a
从入门到进错门
2019/06/21
2.3K0
Eslint使用入门指南
ESLint最初是由Nicholas C. Zakas 于2013年6月创建的开源项目。它的目标是提供一个插件化的javascript代码检测工具。
Snine
2022/02/21
2.1K0
格式设置规则
格式设置规则会影响 .NET 编程语言构造的缩进、空格和换行的排列方式。 规则分为以下几类:
用户4268038
2022/01/09
1.8K0
Java编程规范-命名与语句
建议按照此规范处理 UpperCamelCase 风格:每个单词首字母大写,其余字母小写; lowerCamelCase 风格:首单词全小写,后面每单词首字母大写,其余字母小写; 示例: 【错误用法】
向着百万年薪努力的小赵
2022/12/01
4530
Google Python风格规范(上)
好的代码风格,给人舒服的感觉,今天介绍一下谷歌的Python风格规范,由于规范比较多,将分为两次介绍。
王强
2018/08/09
6960
相关推荐
C语言编程规范 clean code
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验