close

陳述句

在上一篇我們學會使用一個printf來印出文字,但若一個程式只能做這麼簡單的一件事,那不是太沒用了嗎? 別的晚點再談,就先說如果我們有好幾件事想要電腦做的話該怎麼辦? 因為其他的東西我們還沒教到,所以就先用我們教過的printf來說明好了! 假如我們想要做三件事,比如說用印出三行字代表作了三件事,我們只要像這樣寫就可以了:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("First thing.\n");
    printf("Second thing.\n");
    printf("Third thing.\n");

    return 0;
}
    

這樣,程式就會依次印出"First thing."、"Second thing."、與"Third thing."三個字串, 且由於我們加上了「\n」的緣故,這三個字串會分成三行印在終端機上。

我們每叫程式做一個單位的事情,就稱為一個「陳述句」(Statement)或「敘述」。 而陳述句應當以分號「;」結尾,好告訴編譯器這一個陳述句到這裡結束了。 執行時電腦會依照順序先後的執行我們所寫下的敘述,第一個敘述執行完成後才會做第二個,這點很重要, 雖然已經學過其他程式的讀者可能會覺得我再說廢話。 雖然實際上執行的流程應該是一句一句走的,但由於數十年來寫程式的人都習慣把每一個敘述寫成一行, 所以你有時候可能會聽見人家說:「現在執行到這一行,接著執行下一行」這樣口語化的說法。

注意在C語言上還有一點很重要,C語言程式碼中超過一個的空白都是沒有意義的; 並且除了以井字號「#」開頭的指令外,所有的換行也是沒有意義的。 因此我們的程式可以寫成這樣而完全不影響編譯與執行:

#include <stdio.h>
int main(int argc, char *argv[]){printf("First thing.\n");printf("Second thing.\n");printf("Third thing.\n");return 0;}
    

當然,寫成這樣也是可以的:

#include <stdio.h>
int
main
(
int  argc
,char  *  argv  [
])
{
printf
("First thing.\n")
;
printf(
"Second thing.\n"
);printf
("Third thing.\n")
;return
0;}
    

上面這兩個範例是比較極端的例子,實際上很少有人會故意這樣寫來讓自己看不懂! 但這也更明確的告訴我們,若不寫上分號的話,編譯器不知道你的陳述句到底到哪裡才結束,也就因此可能會導致編譯的錯誤發生。

註解

不知你會不會有這樣的感覺,當程式寫的多了、或者今天又學到什麼新花招的時候,你會想要在程式碼上面寫上筆記來告訴自己一些事情? 這時就會遇到一個嚴重的問題,那就是你的筆記通常不會是合法的C語法,因此會被編譯器當成錯誤的程式碼,而導致編譯失敗。 因此,幾乎所有的程式語言都會提供某種語法,好告訴編譯器刻意忽略某些地方而不要去理它,而這樣會被編譯器忽略不管的東西就被叫作「註解」。

C語言規定,編譯器必須要忽略所有「/*」符號之後一直到「*/」符號為止之前的東西,因此我們可以在他們中間寫上我們對於程式的筆記、說明等等文字,像是這樣:

/*
Work 2 : Statements and Comments

Practice to write multi statements,
and add some comments to descript something.
*/

#include <stdio.h> /* We need this to use printf */

int main(int argc, char *argv[])
{
    /* Start to run 3 statements */
    printf("First thing.\n");
    printf(/*We can make comments even here*/"Second thing.\n"/*or here*/);
    printf("Third thing.\n");

    /* Program finished */
    return 0;
}
    

這樣,我們就可以在程式碼中寫上任何的說明文字。 這一點很重要,程式註解雖然會被編譯器完全忽略不管,不會對實際的程式產生任何影響; 但程式碼並不是只寫給機器看的,如果人不能夠看明白程式碼所表達的行為的話,那麼這份程式碼便失去了它最初的意義,即做為人與電腦的溝通橋樑。 因此,請從現在就開始練習以及習慣在寫程式的時候多多寫上註解。

另外,由於註解文字會被編譯器所忽略,因此理論上可以在裡面寫上中文; 但若你的作業系統使用的是Windows的話,還是建議你不要寫中文,即是是在註解裡面,以免有一天不得不認識「許功蓋」這號享譽程式天下的著名人物。 沒辦法,誰叫微軟不爭氣,弄的Windows落後了世界一大節!

單行註解

雖然說程式碼中的換行對於C語言是沒有意義的(除了以#開頭的指令以外),但由於程式人數十年來一直習慣一行一行的寫程式, 因此C語言還特別規定了另外一種形式的註解,這種註解在我們一行一行的程式碼上面特別有用處。 這種註解符號就是兩個斜線「//」,在這兩個斜線後面的東西都會被編譯器忽略,直到這一行結束為止。 舉例來說就像是這樣:

// Work 2 : Statements and Comments
//
// Practice to write multi statements,
// and add some comments to descript something.

#include <stdio.h> // We need this to use printf

int main(int argc, char *argv[])
{
    // Start to run 3 statements
    printf("First thing.\n");
    printf("Second thing.\n");
    printf("Third thing.\n");

    // Program finished
    return 0;
}
    

在這兩種註解方式的互相搭配下,我們就可以很方便的在程式碼上面寫上任何的說明文字了!

程式碼的版面與閱讀

前面提過,C語言超過一個的空白、以及換行通常都是沒有意義的,而這是指對編譯器而言; 換行、多餘的空白、以及註解等這些東西雖然對編譯器無意義的東西,對人類來說確意義太大了!

如同前面展示的兩個極端例子,雖然對編譯器來說哪一種寫法都是一樣的, 但對於閱讀程式碼的人則造成了很大的閱讀阻礙。 因此實際的程式寫作上,我們常常會有規律的加入許多空白來讓程式碼互相對齊、以及分隔敘述中的某些元素; 加入單一的換行來區隔每一個敘述單元; 加入更多的換行來區隔不同區塊的程式碼群組; 並在某些程式碼上面加上註解來解釋一群程式碼的作用或目的, 或在某些可能有點小聰明到會讓人看不懂的程式碼上面寫上一些註解來幫助閱讀。 (您可以自行比較前面的許多範例程式碼,包含正常的、有註解的、以及那兩個極端程式碼)

依據經驗,通常一段程式碼在它的一生中,被閱讀的機會遠大於被寫作的機會。 因此請謹記,在寫作或修改每一段程式碼的時候,務必要常思考: 「當別人看到這段程式碼的時候會有什麼反應」,甚至是 「當有一天你自己回來看這對程式碼的時候,還能夠看得懂嗎」。

程式碼的寫作風格

前面提到,我們一般會在程式碼中加入很多的空白、換行來對程式碼進行版面的配置, 甚至加入註解來輔助解釋一些訊息,形成了程式碼所呈獻的版面風格。 程式碼風格是由人所主觀造成的,沒有哪一種排法是最好或最正確的,而不同的人或不同的開發團隊都可能會寫出不一樣的程式碼長相。 對於程式碼的各種風格使用只有一個高指導原則,就是寫出讓人最容易看得明白的程式碼,至於其它的細節要求都是為了這個目的罷了!

在還沒討論實際的程式碼寫作方式之前,先說明一個對於程式碼風格很重要的第一課,那就是風格上的統一。 雖說各種程式碼風格大部份沒有對錯的問題,但想想如果一份程式碼裡面充斥著各種不同的寫作方式,看起來豈不難過? 於是為了閱讀程式碼的人著想(實際上很多時候其實就是你們自己),請在一份軟體開發案上使用統一一致的寫作風格:

  1. 若你處在一個開發團隊裡共同開發程式,請遵守該團體的寫作風格,通常在一個體制完好的組織裡會有文件定義這些東西。
  2. 若你要維護、修改別人的程式碼,則請依照那份程式碼原有的編寫習慣。
  3. 若你是自己寫作程式碼、自己開發軟體,則你可以完全自由的決定程式碼的風格; 唯請注意自己的風格也要統一,不要自己寫的程式碼前前後後長相還完全不一樣。

雖說對於自己寫的程式,只要使用你自己覺得最適合的風格就好; 然而依據我的經驗,挑選以及制定一個最適合的程式碼的風格是需要經驗和智慧的選擇,而初學入門者通常欠缺這樣的條件! 因此,在初學者在沒有其他前輩可以追隨的情況下,不妨就學習以及使用作者我所習慣的程式碼風格, 而我往後對於風格部份的教學說明也將以我自己所習慣的寫法為主。

在寫作風格上,首先要告訴你們的重點就是:

  1. 一個陳述句請寫成一行,不可貪圖節省版面而將兩個以上的陳述句寫在同一行。
  2. 所有在大括弧(即「{」與「}」)中間的敘述請在行首加上比「{」或「}」前面的空白還要多4個的空白, 我們稱這為「縮排」,使得程式碼會在視覺上往右邊退縮一個距離。 雖然實際上的一級縮排有人用2格、3格、4格、8格不等,但在這裡我要求的就是4格。
  3. 一個大括弧請單獨寫成一行,並且互相成對的大括弧應該對齊在同一排上,然後大括弧「{」應該與其之前一個敘述擁有同樣的縮排空間。

如果說上面的文字敘述不能讓你很清楚明白其表達的意義的話也沒關係,因為我所有的範例,包含前面的範例都是依據這些所寫作的, 因此你也可以從每個範例中去理解這接要求(以及之後會慢慢增加的要求)所實際呈現的樣子。

重點回顧

  • 程式裡面可以寫上很多的陳述句來做不只一件事情,而這些敘述會被依照順序執行, 並且在前一個敘述執行完成後才會再執行後一個敘述。
  • 程式碼裡多餘一個的空白,以及所有的換行對於編譯器來說都是沒有意義的,除了以「#」開頭的指令以外。
  • 從「/*」之後到「*/」為止的東西、以及從「//」之後到該行結束為止的東西都會被編譯器忽略, 我們可以在這些地方寫上任何說明文字,稱為「註解」。
  • 程式碼有關版面的編排、命名的方式等被稱為「程式碼風格」,各種風格通常沒有最正確或最好的,只有最適合某個環境的。

練習與討論

請為你先前練習寫過的程式碼盡可能的加上註解,來為你自己的閱讀與學習提供解說。

arrow
arrow
    文章標籤
    C語言教學
    全站熱搜

    夜行者 發表在 痞客邦 留言(0) 人氣()