第三章:当好机器的老板
无论什么时候我们都不该忘记我们是在学一门语言,而学语言的基本要求是:准确无误的用它来表示自己的意图,不仅要让机器读懂,也要让别人(只要他会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]也叫复合语句
(本文首载于第二是书店)