zoukankan      html  css  js  c++  java
  • 编码风格 缩进和空白

    编码风格 - 缩进和空白

    1. 缩进和空白

      我们知道C语言的语法对缩进和空白没有要求,空格、Tab、换行都可以随意写,实现同样功能的代码可以写得很好看,也可以写得很难看。

    1.1. 缺少缩进和空白的代码

    复制代码
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(void)
    {
    char gesture[3][10]={"scissor","stone","cloth"};
    int man,computer,result, ret;
    srand(time(NULL));
    while(1){
    computer=rand()%3;
    printf("\nInput your gesture (0-scissor 1-stone 2-cloth):\n");
    ret=scanf("%d",&man);
    if(ret!=1||man<0||man>2){
    printf("Invalid input!\n");
    return 1;
    }
    printf("Your gesture: %s\tComputer's gesture: %s\n",gesture[man],gesture[computer]);
    result=(man-computer+4)%3-1;
    if(result>0)printf("You win!\n");
    else if(result==0)printf("Draw!\n");
    else printf("You lose!\n");
    }
    return 0;
    }
    复制代码

    一是缺少空白字符,代码密度太大,看着很费劲。二是没有缩进,看不出来哪个{和哪个}配对,像这么短的代码还能凑合着看,如果代码超过一屏就完全没法看了。[CodingStyle]中关于空白字符并没有特别规定,因为基本上所有的C代码风格对于空白字符的规定都差不多,主要有以下几条。

    1、关键字ifwhilefor与其后的控制表达式的(括号之间插入一个空格分隔,但括号内的表达式应紧贴括号。例如:

    while␣(1);

    2、双目运算符的两侧各插入一个空格分隔,单目运算符和操作数之间不加空格,例如i␣=␣i␣+␣1++i!(i␣<␣1)-x&a[1]等。

    3、后缀运算符和操作数之间也不加空格,例如取结构体成员s.a、函数调用foo(arg1)、取数组成员a[i]

    4、,号和;号之后要加空格,这是英文的书写习惯,例如for␣(i␣=␣1;␣i␣<␣10;␣i++)foo(arg1,␣arg2)

    5、以上关于双目运算符和后缀运算符的规则并没有严格要求,有时候为了突出优先级也可以写得更紧凑一些,例如for␣(i=1;␣i<10;␣i++)distance␣=␣sqrt(x*x␣+␣y*y)等。但是省略的空格一定不要误导了读代码的人,例如a||b␣&&␣c很容易让人理解成错误的优先级。

    6、由于UNIX系统标准的字符终端是24行80列的,接近或大于80个字符的较长语句要折行写,折行后用空格和上面的表达式或参数对齐,例如:

    if␣(sqrt(x*x␣+␣y*y)␣>␣5.0
        &&␣x␣<␣0.0
        &&␣y␣>␣0.0)

    再比如:

    foo(sqrt(x*x␣+␣y*y),
        a[i-1]␣+␣b[i-1]␣+␣c[i-1])

    7、较长的字符串可以断成多个字符串然后分行书写,例如:

    printf("This is such a long sentence that "
           "it cannot be held within a line\n");

    C编译器会自动把相邻的多个字符串接在一起,以上两个字符串相当于一个字符串"This is such a long sentence that it cannot be held within a line\n"

    8、有的人喜欢在变量定义语句中用Tab字符,使变量名对齐,这样看起来很美观。

    int    →a, b;
           →double →c;

    内核代码风格关于缩进的规则有以下几条。

    1、要用缩进体现出语句块的层次关系,使用Tab字符缩进,不能用空格代替Tab。在标准的 字符终端上一个Tab看起来是8个空格的宽度,如果你的文本编辑器可以设置Tab的显示宽度是几个空格,建议也设成8,这样大的缩进使代码看起来非常清 晰。如果有的行用空格做缩进,有的行用Tab做缩进,甚至空格和Tab混用,那么一旦改变了文本编辑器的Tab显示宽度就会看起来非常混乱,所以内核代码 风格规定只能用Tab做缩进,不能用空格代替Tab。

    2、if/elsewhiledo/whileforswitch这些可以带语句块的语句,语句块的{或}应该和关键字写在同一行,用空格隔开,而不是单独占一行。例如应该这样写:

    if␣(...)␣{
           →语句列表
    }␣elseif␣(...)␣{
           →语句列表
    }

    但很多人习惯这样写:

    复制代码
    if␣(...)
    {
           →语句列表
    }
    elseif␣(...)
    {
           →语句列表
    }
    复制代码

    内核的写法和[K&R]一致,好处是不必占太多行,使得一屏能显示更多代码。这两种写法用得都很广泛,只要在同一个项目中能保持统一就可以了。

    3、函数定义的{和}单独占一行,这一点和语句块的规定不同,例如:

    int␣foo(int␣a,␣int␣b)
    {
           →语句列表
    }

    4、switch和语句块里的casedefault对齐写,也就是说语句块里的casedefault标号相对于switch不往里缩进,但标号下的语句要往里缩进。例如:

    复制代码
    switch␣(c)␣{
          →case 'A':
          →       →语句列表
          →case 'B':
          →       →语句列表
          →default:
          →       →语句列表
          →}
    复制代码

    用于goto语句的自定义标号应该顶头写不缩进,而不管标号下的语句缩进到第几层。

    5、代码中每个逻辑段落之间应该用一个空行分隔开。例如每个函数定义之间应该插入一个空行,头文件、全局变量定义和函数定义之间也应该插入空行,例如:

    复制代码
    #include <stdio.h>
    #include <stdlib.h>
    
    int g;
    double h;
    
    int foo(void)
    {
           →语句列表
    }
    
    int bar(int a)
    {
           →语句列表
    }
    
    int main(void)
    {
           →语句列表
    }
    复制代码

    6、一个函数的语句列表如果很长,也可以根据相关性分成若干组,用空行分隔。这条规定不是严格要求,通常把变量定义组成一组,后面加空行,return语句之前加空行,例如:

    复制代码
    int main(void)
    {
           →int    →a, b;
           →double →c;
    
           →语句组1
    
           →语句组2
    
           →return 0;
    }
    复制代码

    The ending...

    
    
     
     
  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3015027.html
Copyright © 2011-2022 走看看