你不知道的C語言–第一篇——編譯和執行

櫻木灬晴子發表於2019-05-12

相信很多理工科的同學在大學期間都或多或少的學過C語言,但由於老師教的不用心或者當時我們知識的限制,導致我們對C語言存在許多誤解。並且我們在學習c語言時,為了方便省事,大多數人都使用IDE,導致我們對編譯的過程完全沒有概念。
博主現在是一名大三的本科生,有幸讀到宋勁杉老師的《一站式學習C程式設計》,發現了許多原來對於c語言的錯誤和模糊的認識,所以總結出來供自己複習並與大家分享
有錯誤的地方請大家及時指正,謝謝!

編譯執行

對於我們初學程式設計時都要寫的hello world程式,相信大家都非常熟悉了,但是即使是這樣一個簡單的程式,我們也未必都全能掌握,下面是helloworld程式碼:

#include <stdio.h>
int main(void)
{
        printf("Hello, world.
");
        return 0;
}

要在Linux上不借助任何IDE編譯執行它,我們需要在命令列輸入一系列的命令:

$ gcc main.c -o main
$ ./main
Hello, world.

其中,gcc是linux下c語言的編譯器,gcc main.c -o main的意思是編譯main.c生成可執行檔案main,這個main可以自己命名。

對於編譯時的警告,有時候並不會全部提醒,但如果我們在編譯時加上-Wall引數,編譯器便會顯示出所有的警告,供我們參考修改程式:gcc -Wall main.c -o main


編譯時和執行時

大家在初學c語言時,一定會被編譯時和執行時搞得一頭霧水,因為那時候我們使用IDE一鍵執行,對於我們來說編譯執行似乎就是一樣的。然而有了上面的知識,我們就很好區分編譯時和執行時了。

所謂編譯時,就是我們在命令列輸入gcc編譯檔案後產生可執行檔案的過程,在這段時間出現的錯誤,就是編譯時錯誤,一旦編譯時出現了錯誤,就不會再產生可執行檔案了,編譯就被中斷了。

而執行時錯誤就是在編譯通過,生成可執行檔案後,我們執行這個可執行檔案之後產生的錯誤,這種錯誤一般更難捕捉。

如我們在學習全域性變數和區域性變數時有一條規定:

區域性變數可以用型別相符的任意表示式來初始化,而全域性變數只能用常量表示式來初始化。

之所以會有這樣一條規定,就是因為全域性變數必須在程式開始執行時初始化完成(執行任何語句之前),所以初始值必須保證儲存在編譯生成的可執行檔案中,因此初始值必須在編譯時計算出來。所以為了簡化編譯器,才規定全域性變數只能用常量表示式來初始化。

問題的關鍵還是要區分編譯時執行時

參考文獻: 《一站式學習C程式設計》 宋勁杉

相關文章