2011年12月11日 星期日

C 語言入門 - 人生中第一個程式

你的第一個程式

  在環境設定好之後,便可以開始動手寫人生中第一個程式了。在左上角找到「檔案」 -> 「開新檔案」 -> 「原始碼」,或是用熱鍵 CTRL+N,即可開啟人生新的一頁。沒錯,馬上你就會寫程式了,而你人生中的第一個作品即將誕生。請輸入下列咒文:

#include <stdio.h>

int main()
{
    printf("I'm fucking pro\n");
    while(1);
    return 0;
}

  好吧,也許在你為自己人生中第一個程式,嶄新的一頁竟然長這個樣子而後悔前,把「I'm fucking pro」改成其它你覺得不會後悔的句子。請避免中文、注音或全形標點符號,甚至日文韓文一類的東西,否則日後你對人生中第一個程式的印象,很可能就是沉睡在一堆不明所以的錯誤之中不讓你執行。拜託也請不要開始想一篇座右銘或自傳或得意的文章之類的東西,不如繼續學習,讓寫程式變成你自傳中的得意技,或者早點放棄它然後繼續尋找你的興趣。

  在輸入完之後,按下上方的「執行」 -> 「編譯並執行」,或是熱鍵 F9,或是上面小圖示第二列找到「編譯並執行」然後按下去,稍等一下下,萬一很幸運地每個符號都打對了,那麼應該會跳出一個小黑窗,顯示著「I'm fucking pro」。萬一很不幸地某一行變紅了,卻沒跳出小黑窗,那麼請回頭檢查看看有沒有哪兒打錯了吧。你可以為你多了一項技能而歡呼,甚至開個慶功宴,但別忘了繼續強化它。請記住你還沒去弄懂這段程式碼的任何一行。

  之後寫了任何新的程式碼,請記得在編譯之前是無法執行的。若是進行任何修改,然後按了「執行」而非「編譯並執行」的話,因為並沒有在修改之後進行編譯,所以可執行檔還是之前的編譯結果,這時執行的將會是舊的編譯結果,也就是最後一次進行編譯時的程式碼。所以你的任何改動都不會產生任何影響。因此比較好的習慣是,每次都重新編譯並執行,能避免掉許多可能的問題。


何謂編譯?

  電腦只看得懂 0 和 1 的指令而已。換句話說,它看不懂你的程式碼。事實上它甚至只把你費盡千辛萬苦寫出來的寶貝程式碼,當作一個純文字檔案來看待。因為我們沒有告訴它任何事情,在它看來你只不過建立了一個純文字檔案。那麼,怎麼辦呢?首先我們必須翻譯成電腦看得懂的指令,這就是編譯 (Compile)。

  透過 C 語言的編譯器,它會將你的程式碼試著翻譯成電腦看得懂的形式,這個過程就是編譯。如果在編譯過程,發現你寫的程式碼不符合語法,就會產生編譯錯誤 (Compile Error)。好心的編譯器會提示你發生了哪些錯誤,以便改正。若是成功,則編譯器會產生出一個可執行檔,透過執行它,就可以讓你的程式開始運作。

  IDE 將產生程式碼所需的文字編輯器 (Editor) 以及編譯程式碼用的編譯器 (Compiler) 整合在一個軟體中。當然可能還包含除錯用的 Debugger 或是其它功能。由於並非是把所有東西重新寫成一個程式,而是透過一個程式將其包裝起來,所以只是「整合」。就像是把快過期的牛奶和剛研發的新口味果汁綁在一起賣一樣,只是拿快過期的牛奶,以及新口味果汁,綁在一起販售,而不是整個倒在一起加料後換個新瓶子裝起來。原本的東西還是原本的樣子,只是被整理起來了。

  如果沒有使用 IDE,也可以只用文字編輯器來編輯程式碼,再自行使用編譯器將程式碼編譯成可執行檔,再手動執行。雖然 IDE 提供你編輯環境,還讓你一個按鍵就能直接編譯並且執行,相當方便,卻也不是那麼不可或缺。即使沒有 IDE 的輔助,仍然可以寫程式。甚至可能會像以前舉的女僕的例子,IDE 為你做了太多考量,導致效能低下,時常為你補上它猜測你接下來要打的字,卻常常猜錯,反而會造成種種不便。沒有絕對的好壞,選擇自己喜歡的方式即可。


回頭看你的第一個程式

  C 語言的程式碼最常見的起手,就是這個樣子。讓我們慢慢研究它。當然我不會講得太過深入,現階段努力記住它的長相比較重要,之後會分別在屬於它們的章節,一一介紹關於它們的一切。

#include <stdio.h>

  以 # 開頭的一行,表示屬於前置處理 (preprocessor, 中文翻譯不明) 的意思。這在編譯期間會先被處理掉,然後才會對其它部份進行編譯。

  #include 用來載入「標頭檔」 (header file)。在 C 語言中,已經為我們內建了不少方便的函式 (function) 供我們使用,例如將文字輸出到畫面上,讀取使用者的輸入,甚至計算三角函數等等。這些並不需要我們自行動手完成,只要載入我們想使用的函式所在的標頭檔,並且呼叫它們,就可以做到這些相當複雜的事,而不用自己設計程式碼來處理。

  在 #include 之後,會用大於和小於符號,將目標標頭檔的檔名給括起來。因此這行是載入名為 stdio.h 的標頭檔。這類檔案一般副檔名為 .h,而 stdio 則是「標準輸入輸出」 (standard input and output) 的縮寫,裡面都是一些與輸出和輸入相關的函式。

  輸出是將資訊用各種方式呈現出來,如螢幕、喇叭等等。輸入則是接受來自使用者的資訊,例如鍵盤滑鼠等等。假使電腦做了相當複雜的演算,卻沒有把結果顯示出來就結束了;或是無法針對使用者的操作而改變運算目標,像是執行時永遠只能算 1 + 1 而不能讓使用者輸入想計算總和的兩個數字,都是相當大的問題。因此 stdio.h 是非常非常重要的,幾乎每個程式都會用上它裡面的函式。

int main()
{
    return 0;
}

  這裡則是函式宣告,詳細可以參考之後與函式相關的文章,現階段可以先記住長相就好。在 C 語言中,名為 main 的函式是最重要且不可或缺的。因為程式執行時的進入點就是在 main 這個函式。也就是說,任何 C 語言的程式,都是從 main 函式開始執行的,並且在執行完 main 函式裡的程式碼後,程式便結束了。

printf("I'm fucking pro\n");

  這一行是在螢幕中輸出「I'm fucking pro」的意思。「\n」代表換行,如果沒有輸出換行的話程式是不會自動幫你換行的。即使在顯示過長時被自動換行顯示,本質上還是沒有換行的。關於 printf() 的事情很快就會提及。

while(1);

  這一行是讓程式卡住,讓它無法結束。為什麼要這麼做?你可以試著把它拿掉,編譯並執行看看。編譯能夠正確地進行,程式也能夠正確的執行,但會在執行的一瞬間自動關閉。那是因為整個 main 函式,只有一件事要做,就是在螢幕上顯示一行字。因此顯示完的瞬間,main 函式裡的程式碼也就執行完了,程式就會直接關閉,這樣會很難看清楚結果。所以加上 這行,讓程式執行到這邊時卡住,我們也就有足夠的時間,從容地檢視結果。

  到這邊大致有個了解就行。詳細部份在介紹到它們時會講得更清楚,在那之前先試著把長相記住。

1 則留言:

  1. 推,可是全白的字有點太刺眼了,建議可以稍微調暗一些,如#eee或#ddd之類的。

    回覆刪除