“我的 C 语言都学完了,书上的代码我都看得懂,但是为什么每当自己写代码的时候,就会发现无从下手?”我想上面这个困惑或许存在在大多数人的内心里面吧。可以说每个软件工程师在一开始的菜鸟阶段或多或少会都会有上述的困惑,无论以何种方式去学习的软件,无论师从何人。对于这个问题,本文将会讨论,如何一步步度过这段尴尬的时期,最终写出华丽的代码。

 

1 、优雅的代码

衡量一个代码好坏,主要有两个维度:

 

第一个维度是人的维度,即代码比较精简,毫无冗余,格式工整。从这个维度上去衡量一个代码的好坏,还是停留在阅读者的角度来评判。一个好的代码,通俗易懂是必须的,即不管是编写者来阅读还是后续维护者来读,都能够一目了然地可以看出这段代码想要表达的意思。这就要求这段代码具有统一的函数、变量命名规则,整齐的代码格式,紧凑的程序语句,适当的函数长度,以及合理,恰当的代码注释。满足上述标准的代码虽然很少见,但是其反面例子还是很多的,如图 1 所示。

 

图 1 烂代码

 

图 1 中的代码不仅编码毫无格式可言,还将函数直接写在了 .h 文件里面。不仅如此,其中还存在着很多历史遗留的不需要的代码还舍不得删除,因此根本毫无易读性可言。

 

第二个维度是执行者的维度,即机器维度,使用这个维度来衡量一个代码的好坏,主要是看这个代码执行的时间复杂性和空间复杂性。不过这个问题一般刚刚入门的童鞋可以忽略,在现在这个单片机内存都能达到 1M,速度都能达到将近 200M 的时代,可以暂且将这一块的比重放下。

 

以上的阐述,其实可以将目前主流的代码分成四个象限,如图 2 所示。

 

图 2 对号入座

 

2、深入浅出

通过图 2 的划分,相信你一定可以找到自己目前所处的象限,接下来的内容,是主要介绍,如何从一个刚刚学习完编程课程的童鞋,一步步提高到第四象限,即“你需要编写更多的代码阶段”。

 

在你刚刚看完编程教程之后,你的内心有 90%的可能是懵的。这个时候,假设让你写一个两个输入数做加减乘除四种运算的计算器程序。你一定会思绪万千,“这个是不是就是先输入一种运算符号,然后输入两个操作数,最终再输出一个结果?,我在书上做过输入的练习,我知道用 scanf 函数做输入,加减乘除我也做过,选择语句我也知道,就是 if…else,输出我也知道,就是 printf 函数,那是不是我把它们整合到一起去就行了?”以上这些思考过程,我相信不管你是脑子里闪现的,还是书上找到的,只要认真听课都能够想到。好了,接下来让你第一次来写这个程序的时候,你的手就会有些僵硬了,于是,过了半天,“.c”文件里面还是只有“#include”和“void main(void)”两行。因为此时你一定还在想,该如何定义变量来存储“+-*/”这四个符号。其实这个过程就是“动手恐慌”,这个时候你一定要克服这种心理,想不到定义这个变量的名字就随便取一个,“a”就行,一开始无需太追求优雅,但是我们可以认真地将注释写好,如图 3 所示。

 

图 3 克服“动手恐慌”,随意定义变量名称

 

接着,你此时应该想到第二步就输入,首先输入的是运算符号,在运算符号输入完成之后,依次输入两个运算数。那么在使用“scanf”做输入的时候,应该用%d,%c,还是%s 来适配这个符号呢?这时候,你可以适当找寻书本,这是个很不错的办法。当然,最好的办法就是试,并且小部分调试,即我先选一个%d,接着输入完成之后,将其打印出来,看看结果,如果不对,那就再换成其他的,再来试,如图 4 所示。

 

图 4 小部分调试

 

从图 4 的代码中,我们可以看出,用%d 来通配符号的输入肯定是不行。因此,我们可以换成%c。如图 5 所示,结果我们发现%c 做符号的适配是可以正常输出的。

 

图 5 小部分调试正确

 

上面的这个方法很有效,一般我们写代码时,一定要保证每一个小模块的代码是正确且鲁棒性强壮,所以经常使用这种小范围的调试。

 

接下来,可以继续写下去,输入两个运算数,这个比较简单,如图 6 所示。当然,你也可以将这两个数输入之后打印出来。

 

图 6 图 5 程序的继续

 

在确保所有输入都正常之后,我们就可以来写下面逻辑的部分了,一般这种根据输入条件选择不同程序语句的执行顺序,我们第一反应就会想到“if…else”的形式。而很多童鞋第一次使用“if…else”的时候,是不会想到“if…else if”这种形式的。所以,既然想不到那也无所谓,直接只使用 if。因此可以写出如图 7 所示的选择框架。

 

图 7 只用 if 来选择执行

 

这个选择框架写出来之后,我们就可以将相应的语句写入相应的条件中。如图 8 所示。

 

图 8 四则运算代码

 

#includevoid main(void){    char a; // 用来存储运算符号    int b, c; // 用来存储运算的数字    int d;// 用来存储结果    printf("select + - * /\n");    scanf("%c", &a);    printf("sign %c\n", a);    printf("input b\n");    scanf("%d", &b);    printf("input c\n");    scanf("%d", &c);
    if(a == '+')    {        d = b + c;    }    if(a == '-')    {        d = b - c;    }    if(a == '*')    {        d = b * c;    }    if(a == '/')    {        d = b / c;    }    printf("result %d\n", d);}

 

到此为止,你已经完成了从初学者进阶到了写代码的第一阶段,“该好好加油了”。这个阶段需要的时间可能非常短,一般坚持一个月左右就能达到。但是我们可以看到图 8 中的代码,其内部的变量定义很不优雅,而且代码中也有些许漏洞。

 

下一篇内容,我们将来美化这一段代码,使其变得优雅起来。