《The C Programming Language》读书笔记3

第三章:当好机器的老板

 

   无论什么时候我们都不该忘记我们是在学一门语言,而学语言的基本要求是:准确无误的用它来表示自己的意图,不仅要让机器读懂,也要让别人(只要他会c语言)读懂你的意思。记住,语言是用来交流的,不论是编程语言还是自然语言。现在让我们对这两个交流的对象分别作个分析,如何才能让他们明白你想干什么,打算怎么干。

  对于机器来说,我们要做的相对要简单点,编程语言的语法比自然语言要简单的多了,一切都由顺序、选择、循环三种结构复合而成,初学者要做的只是走一个“抄写-改写-模仿-习惯”的过程而已。等这些语句成了你的习惯那就太好了,就像你说汉语的时候不会去考虑你用的是陈述句还是感叹句,呵呵,(这个让我想起了我糟糕的英语,汗~~~)。当然我们对机器要做的远远不止这些,让机器读懂这只是第一步而已,如何让机器按照我们的意思运行的更好、更快才是我们要追求的境界,当然,这个境界没有止境。得在经验中慢慢积累,下面只是提出几个个人的建议而已:

第一.    尽量使用局部变量。因为c语言有个特点,在同个域中的变量必须定义在所有处理语句之前(分程序[o1] 除外),这意味着在程序开始的时候就必须分配好所有的静态空间,而很多数据在程序中用很少,因此我们需要减少这些不必要的开销,灵活运用分程序可以将这些对象进一步局部化,比较下面两段代码:

Code1:

#include "stdio.h"

#include "stdlib.h"

int main()

{

    int ix;

    char c;

    scanf( "%c", &c );

    if( c == 'y')

     {

        ix = 100;

        printf( "this is %d! /n", ix );

     }

   

    system( "pause" );

      return 0;

}

Code2

#include "stdio.h"

#include "stdlib.h"

int main()

{   

    char c;

    scanf( "%c", &c );

    if( c == 'y')

     {

        int ix = 100;

        printf( "this is %d! /n", ix );

     }

   

    system( "pause" );

      return 0;

}

你会发现如果我们不输入‘y’系统就没有必要为ix分配空间。

 

第二,注意和正视一些看起来像bug的语言特性,比如switch语句,可以说从c语言建立的那天起对他的争论就没有停止过,它的向下穿越给我们带来了不少麻烦。以至于在《c专家编程》的第二章中把它说成是“多做之过“,但是我们发现有时候它的功能还是不可代替的,比如判断一个数是否属于某个离散集合:

#include "stdio.h"

#include "stdlib.h"

int main()

{   

    int i;

    while( scanf( "%d", &i ) != EOF )

    {

        switch( i )

        {

          case 1: case 2:

          case 3: case 5:

          case 8: case 13:

          printf( "yes!/n" );

          break;

          default :

          printf( "no!/n" );

          break;

        }

    }

   

    system( "pause" );

      return 0;

}

呵呵,这个数列大家都熟悉,但是除了switch语句你能找到比他更简洁的表示方法吗?但这正是运用了语句的向下穿越性啊。goto语句也有类似的情况,只要我们仔细研究,这些看起来很麻烦的东西都会变得非常美好。

好了,对机器的交流我们就说到这儿吧。在下次笔记中我们将谈谈和人的交流-程序的风格问题。


 [o1]也叫复合语句

(本文首载于第二是书店)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值