第三章:當好機器的老闆
無論什麼時候我們都不該忘記我們是在學一門語言,而學語言的基本要求是:準確無誤的用它來表示自己的意圖,不僅要讓機器讀懂,也要讓別人(只要他會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]也叫複合陳述式
(本文首載於第二是書店)