好像沒有什麼意義、不知所云,而且太多細節以致於無法記憶。
事實上,會這樣子是很正常的,因為誰都有過
一定要先大致明白它在說什麼,才不會在一開始就因為看不懂而喪失熱誠。
基本的C語言程式,分成兩個部分:前置處理、程式本體。
如果是剛學的人可以先不用瞭解前置處理的細節,只要明白它是用來作一些特別用途就行了。
我們用一個簡單的範例來說明程式碼的結構:
#include <stdio.h> int main() { printf("Hello!World"); /* 這會印出一行字:"Hello!World."。 */ return 0;//告訴系統程式正常結束。 } |
上列的程式,就是一個簡單的C語言程式:
其中綠底字的是前置處理指令,主要是叫編譯器把stdio.h的內容引入
----->把我們要用到的其它檔案和主程式結合。
這個檔案的內容在作些什麼呢?就是在作標準系統的輸入輸入動作啦
----->STandard Input/Output Header
那一定會有人問:為什麼要引入別的檔案?
因為有很多東西我們初學者不能也不會自己寫出來,卻又十分重要且常用到:
有如輸入輸出等;故我們常常會直接用別人定義、寫好的部分程式----->我們稱之"程式庫"
(library,意即和圖書館一樣可以自由取用的程式資源),所以我們用引入的方式
讓它可以被我們方便地取用之。(P.S.只要是前置處理的指令,在最前面就會有"#"號)
而較淺灰色底的是程式的本體,也就是我們要要求電腦為我們作事時,表達指令的地方:
我們的程式就從"int main()"底下那的大括號({)後開始,到最底下那行的大括號(})結束。
為什麼我們要這樣寫,而中間那堆字又表達了什麼呢?
首先由為什麼我們要這樣子把程式寫在一起的原因開始瞭解:
電腦本來從最初發明起迄今都是一個指令一個動作,但由於人的需求隨著機器進步也大幅提高;
隨著程式變得龐大,由一個個最基本指令要寫成一個大程式的因難、複雜度也不斷地增加,
所以為了撰寫程式的人的方便,就有人用人可以看得懂的代號來代替機器的代碼;
這時程式越寫越大,所以有人就把程式寫人一小塊一小塊的樣子,
以簡化思緒以及重覆使用已經寫過的程式;
(就像你自己作了工具給全家人,有人要用的時候再拿來用,就不用很多把一樣的工具)
慢慢地這樣的程式結構就演化而成"程序"(procedure,在C語言中稱之"function"),
我們程式中"int main()"以及以下的程式就是一個"function"。
但這還是最接近各個機器的指令代碼的撰寫方式,所以在電腦的能力更上一層樓之後,
就有人發明用更人性化的描述方式去撰寫要命令電腦作什麼事所下的指令:這就是高階語言。
基本上我們可以任意將function取名,不過我們main function一定要叫main:
因為惟有取名叫main,翻譯的程式(即編譯器)才能知道這個程式要從這裡開始
--->換而言之,取名main的function就是程式的起始點(進入點,entry point)。
那為什麼我們要在main function前頭加上"int ",在後頭加上"()"呢?
在main前面加上"int ",那是因為每當程式執行結束之後,程式要告訴系統:"我是否正常結束?"
而這個資訊是以integer(整數數值)的資料格式傳遞,
所以在main function前加上int代表它的回傳值
因此我們可以看到在main function裡面,有一行"return 0;",它就是在告訴系統: 我已正常結束
為什麼要在main後面加上"()"呢? 這是C語言的語法,它告訴編譯器說: 這個main是一個函數喔
---->沒錯,就像數學裡面學到的函數,寫法差不多
在這個例子中,這個main function沒有參數(parameter)
在main裡面如果要印出一行"Hello World",要怎麼放呢?
我們可能會想很多,像是: 好像不小心寫錯地方,就會爆炸似的 ---->不會爆炸啦XD
寫程式最忌怕東怕西,我們只要寫對位置就好:
要印出HelloWorld的動作,必須要在"return 0;"之前,因為一旦return 0之後
程式就會跳回系統了,也就是說,寫在main裡"return 0;"之後的程式是不會被執行到的
(因為程式跳回系統並結束了) 因此我們寫在return 0;之前,就行了
而printf是什麼呢? 我們前面有提到印出一行Hello World的字,看起來好像就是它在作的
沒錯!就是這個函式在作印出到畫面的動作,但為什麼它長得怪怪的,叫什麼: print"f"?
為什麼要加個"f"呢?因為這個printf其實是一個很強大的印出功能,
他真的名字叫作Print format string
也就是說,它可以很強大地印出格式化的資料,好比說:
我想印出"某人正在作某事",而某人和某事各有好多不同筆資料,我又不想自己組合
如果用printf來印出的話,我只要用格式化的寫法就可了:
printf("%s正在作%s", someone, something);
也就是說,我用第一個%s來代表第一個someone變數,第二個%s來代表第二個something變數,
這樣就能把很多格式統一的資料整理印出來
在這個程式碼範例中,我們就很簡單地使用printf印出"Hello!World"字串
最後,記得在每行叫程式執行動作的最後面,加上一個";"
因為這樣程式才知道這行statement已經結束
等等...那為什麼#include那行 還有int main() 及最後的}等等都不用加分號?
- #include那行是寫給編譯器前置處理看的,它不算是程式的本體,沒用加也不能加";"
- int main()那行因為它是在定義一個完整的函式(而且才定義到一半,加分號等於打斷),不能加分號(除非是定義函式的原型,這在之後的章節會提到)
- }那行也是和2.同樣的原因,如果是定義一個完整函式,那麼不能在最後加分號(除非是定義原型)
基本上,大家先有個基本認知就行了:
反正前置處理和完整函式定義的最後面,都不用加分號(";")
其它除非是流程控制或特別的語法,不然每一行statement應該都要加分號(";")當結尾
第一章先到這裡啦:D 跨越了8年,終於找個時間把這篇寫完了
後面會正式切入基本流程控制Part 1(If else,switch)