如同創世紀,程式的執行也有個開頭。 第一個執行的C程式通常會從main這個入口函數開始(雖然第一個執行的不是main,而是連結器程序指定的入口函數,但初學時不必拘泥於這些細節);避免無聊,我們仿效傳統寫一個在螢幕(console)上輸出"Hello my first c program!"字樣,有個便捷的工具printf
可以做到這點,但這個工具的程式碼撰寫於stdio.h
檔案中,因此我們必需先將它納入(用include搭配<>符號)才可以使用;最後,作為C語言程序的結尾,我們仿效傳統回傳一個值0
來代表整個 main 函數平安的結束。
讓我們看一下對應的程式碼 test.c (以下程式可於colab執行)
#include<stdio.h>
int main();
int main(){
printf("Hello my first c program!");
return 0;
}
那test.c這個程式碼要怎麼執行呢? C語言程式碼有點像人類的語言,為了讓電腦讀懂,我們需要透過編譯(compile)轉換為二進位的機器語言檔案,之後才能直接執行這個程式。 gcc 是一個可以執行編譯的工具,我們先用它將 test.c 編譯成二進位檔案,為了方便辨認,我們將輸出的二進位檔另存成(加上-o符號就可以指定新名稱) test.out 的名稱。
# gcc的指令最後,我們加上 test.c 這個想編譯的程式碼
!gcc -o test.out test.c
# 執行二進位程式碼 test.out
!./test.out
# 輸出
>> Hello my first c program!
我們"稍微"深入一點來理解這個程式:
// include關鍵字會將三角形括號內的檔案('stdio.h')中的C程式碼貼在test.c的最上面,這樣程式碼中的工具(函數)就隨我們用了,而不用自己重寫!
# include<stdio.h>
// 函數聲明,函數main沒有接收參數,所以是空括號
// main 函數的返回值是一個整數(int)
int main();
// 實現上面聲明的函數main
int main(){
// printf函數定義於stdio.h檔案中,所以要先include
// printf 在這邊接收字串為輸入,這邊我們不接它的返回值
printf("Hello my first c program!");
// 如同聲明的那樣,返回整數 0,感覺很 peace!
return 0;
}
C語言有所謂標準函數庫(standard library),講白了就是一堆C程式碼檔案,這些檔案預先寫好很多實用的功能讓我們不用重複造輪子;例如,stdio.h
就是控制Input/Output的C程式碼,裡面有一個printf
函數來協助我們輸出文字到螢幕上;標準函數庫的這些C程式碼檔案放置於某個預設的位置,因此可以用三角形括號代表 "請在預設位置搜尋檔案",如果檔案是放在自己定義的路徑,則用 "/user/path/mylib.h"
來指定搜尋位置,這個例子是我們想搜尋mylib.h檔案,它應該在 /user/path
這個路徑底下。
這裡科普一下函數(function),它是一個把常用的程式片段包裝成可重複呼叫的程序,函數可以接收一些參數、並輸出一些結果;例如 "把一個數字加二可能是一個常用的功能,我們為這樣的函數取一個名稱" addtwo ,這個函數預計接收一個整數 addtwo(int)
,然後回傳一個整數 int addtwo(int);
定義完這個函數的外貌,我們就來實現裡面的內容(把數字加二的部分): int addtwo(int num){ return num+2; };
這樣呼叫 printf( addtwo(1) );
,就會在螢幕上看到3了。
當然函數可以一氣呵成的寫完,不必將定義與內容分開撰寫,但大型程序中,通常會將其區分為函數介面(int addtwo(int);
) 與實現(int addtwo(int num){ return num+2; }
),實現的部分是 {...}
裡面的程式碼;這樣review大型程式時,可以藉由函數介面快速掌握程式的功能。
回傳整數是 main 函數的規範之一,你會看到很多教科書的錯誤寫法 void main(){}
; 也可以運作正常,但他們會在一些詭異的狀況下造成bug,不如初學時即養成良好的習慣,永遠記住 int main(){return 0;}
。
可以看到主程式 main
結尾在 return 0;
語句,但這卻不是必要的(若省略,則編譯器會自動視為回傳0);值得留意的是,程式採用非0值作為異常,例如執行完C程式後,echo $?
可以查閱程式的執行結果(exit code
)。
恭喜你入門了很難搞的C語言!!
本系列文章的目標也是希望最後讓人對C語言的印象不再是那麼高不可攀,而是有它平易近人的一面 (或許...
預告 CH2 : 資料型態
update log : 2024/11/24 17:24,