美文网首页
第9章 编写清晰代码所需编码准则

第9章 编写清晰代码所需编码准则

作者: FelixDai | 来源:发表于2019-08-04 15:53 被阅读0次

    9.1 不要投机取巧,应致力于编写清晰易懂的程序

    类似于以下形式代码:

    while('\n' != (*pT++ = *pS++)) {
        // …略…
    }
    

    9.2 切忌混淆while语句中关系运算符和赋值运算符的优先级

    while((c = getchar ()) != EOF) {
        putchar(c);
    }
    

    9.3 不要进行隐式“非零测试”

    9.4 不要在条件表达式中使用赋值语句

    9.5 避免产生副作用

    “副作用”指程序员意料之外的结果,即运算、控制或调用等偏离程序员预想的方向。C语言中不提供于这种副作用相关的提示消息,而将避免副作用的职能和责任全权交给程序员。
    自增自减运算符是这种副作用的最具代表性的示例。
    不要投机取巧,尽可能做到简单明确。此时适用的原则就是KISS(Keep It Simple and Short),该原则来源于句法理论。C语言同样是语言之一,也应该遵循这一原则。

    9.6 函数原型中也要标注参数的数据类型

    布莱恩·克尼汉和丹尼斯·里奇在《C程序设计语言》中最早提出C语言标准,书中称,函数声明时并不要求必须在函数原型中指明数据类型。

    #include <stdio.h>
    
    int Team();
    void Score();
    int Board();
    
    int main(void) {
        // …略…
    }
    

    以前这种形式的语句时合法语句,但因为无法从中知晓这些函数究竟需要几个什么类型的参数,导致程序模糊不清。程序员不得不查看函数主体部分进行确认。如果不这么做而任意假定参数的数据类型,那么查看main()函数时就无法正确解读程序。

    9.7 形式参数也需要命名

    9.8 必须标注返回值的数据类型

    C语言允许定义未指定返回值的函数,main函数就是典型示例。以前可以如下所示,定义没有明确指定返回值的main函数:

    main (...) {
        // …略…
    }
    

    但这种隐式函数定义方式存在问题,因为无法从中准确知晓该函数将返回何种值。正常处理情况下通常返回0,其他情况则返回0以外的其他数值。但编译器的这种自动处理的返回流程并不可信,因为有些编译器可能并不遵循这套处理方式。比如,有些编译器返回函数地址,还有些未成形的编译器会返回处理后的局部变量地址。

    9.9 留意结果值

    以C语言种的标准函数strcmp()为例,该函数用于比较两个字符串,如果两者相同则返回0。

    if (strcmp (string1, string2))
        printf("两个字符串相同。\n");
    else
        printf("两个字符串不同。\n");
    

    这段代码好像有点问题。编写该代码的程序员似乎做出了如下假定:调用某些函数时,如果调用结果是“乐观的”,则对应真值的返回值为1.此处“乐观的”指的是两个字符串相同,因为程序员将strcmp()函数视为比较两个值是否相同的函数。并由此认为,如果两个值相同,即结果“乐观”,那么理所当然返回1。

    因此,程序员使用strcmp()函数时,必须进行如下3种操作:

    1. 查看手册或函数说明书,确认两个字符串相同时的返回值。
    2. 使用strcmp()时添加注释,记录其返回值。
    3. 比较strcmp()函数的返回值时,务必使用逻辑运算符明确表示。

    总之,各位必须牢记,C语言所有运算、调用、控制过程种,真值并不一定始终返回1。因此,必须仔细查看手册,并在代码中用注释和关系运算符做出明确标注。

    9.10 在for语句等条件表达式中谨慎运算

    9.11 大量使用冗余括号

    常用于do...while()语句中

    9.12 如果else语句使用大括号,那么if语句也应该使用

    9.13 函数末尾务必编写return语句

    即使函数的返回值数据类型为void,也要编写return语句。

    相关文章

      网友评论

          本文标题:第9章 编写清晰代码所需编码准则

          本文链接:https://www.haomeiwen.com/subject/feajdctx.html