1. 程式人生 > >理解C語言——從小菜到大神的晉級之路(3)——C源程式的基本結構與除錯方法

理解C語言——從小菜到大神的晉級之路(3)——C源程式的基本結構與除錯方法

    本期視訊點選這裡   

    在上一篇中,我們進行了Visual Studio 2013的安裝以及第一個demo程式“HelloWorld”的建立。現在我們看一下其中的原始碼及相關的C語言基礎知識。開啟工程,可以通過在原始檔標籤欄的右鍵選單中快速開啟原始碼的所在目錄。HelloWorld的簡單程式碼:

#include <stdio.h> 
int main() 
{
    printf ( "Hello World! \n" ); 
    return 0 ; 
}

1、C語言原始碼的編譯生成過程         可以很明顯地看出,我們編寫的原始檔實際上以一個文字檔案的形式存在,其中以ASCII碼錶示的文字內容就是我們編寫的C語言程式碼。而編譯器所做的,就是將文字檔案形式的原始碼通過各種處理,最終生成可執行檔案。這個可執行檔案以及大多數的中間檔案與原始檔明顯不同,他們屬於二進位制檔案。
在編譯生成過程中,編譯器所做的工作主要有四個步驟:
①預處理:在這一階段,IDE的前處理器會尋找以#開頭的命令對源程式進行修改。如#include某個標頭檔案,則會將該標頭檔案的內容直接插入到原始碼檔案;而#define巨集定義則會對原始碼中的巨集進行替換。此階段得到的結果是另一個原始檔,其長度遠大於我們自己編寫的原始碼。 ②編譯:在編譯時,IDE的編譯器將剛剛預處理所生成的原始碼中的語句進行處理和翻譯,生成由組合語言組成的程式;通常,在某個平臺上(如X86)所使用的組合語言大體是一致的,因此組合語言可以將不同的高階語言的輸出做一定的統一。通常,編譯也是一種高階語言進行開發最重要的階段。
③彙編:在彙編階段,IDE的彙編器將上一步生成的組合語言檔案中的指令進行翻譯,生成計算機可以識別的機器語言。這一步的輸出稱為目標檔案,在VS的工程中生成的目標檔案字尾名是.obj。
生成的目標檔案 ④連結:我們所編寫的程式碼經常用到當前原始檔之外所實現的函式,如demo中的printf函式就是如此。而這個函式最終實現的機器語言程式碼必須整合到當前工程的程式中,這一步就由IDE的聯結器實現。經過連結之後,IDE就生成了包含所有必須資源的機器語言的檔案,這就是最終生成的可執行檔案。在Win平臺下可執行檔案的字尾名為.exe。
2、C程式中的函式         一個C程式,無論大小,均是由函式以及其他輔助資訊組成的。C語言的函式實現程式的運算功能,而變數用於儲存計算的值。在HelloWorld這個Demo中,只存在一個函式就是main函式。main函式,即主函式是所有函式中比較特殊的一個,所有的C程式必須且只能有一個main函式,因為main函式是整個程式的入口點,所有的程式必須從main的起點開始執行。
        除了main函式之外,C原始碼中還存在大量的庫函式和程式設計師自定義的函式。如HelloWorld工程中的文字輸出函式printf就是屬於標準輸入輸出庫的一個函式,包含在標頭檔案stdio.h中,並在程式碼開始的預編譯指令#include中引入。該函式的功能是格式化列印字串到控制檯中。由於該函式是最方便的輸出資料的方式,因此在C控制檯程式中的使用率也是最高的之一。         自定義函式是程式設計師為實現自己的功能所實現的函式。在真正的C語言實踐的工程中,自定義函式才是佔據程式碼絕大多數的主體。在程式設計師編寫的自定義函式中,根據需要呼叫包括輸入輸出等在內的庫函式。
3、變數和表示式         對於計算機程式來說,最核心的任務無非就是對器件的控制或者對資料的處理。無論承擔哪一種任務,資料都是重要的因素。而變數在程式中主要作為資料的容器,幾乎所有程式語言都需要相應的變數系統來支撐其功能的實現。在C語言中常用的變數主要有字元型(包括字元和字串等)和數字型(包括整型和浮點型)等,此外還定義了結構體、共用體等組合資料型別用於處理更加複雜的問題。         為了對變數進行處理,C語言中定義了多種運算子實現變數的多種計算。C語言中的基本運算子有+、-、*、/和%,分別表示求和、求差值,求乘積,求商以及求餘數操作。此外,C語言還規定了多種其他的運算子構成算數表示式,不同的運算子按照不同的運算順序規定了不同的優先順序,其中最高的是括號()、陣列索引[]、結構體成員.和->,最低的是逗號運算子','。另外,由賦值運算子構成的表示式為賦值表示式,賦值表示式可以為某個變數賦予一個新的值。 4、如何對C程式碼進行註釋         C程式中除了有效程式碼之外,還有另一個重要的部分就是註釋。註釋是程式碼文件的核心部分之一, 通常是對程式碼的功能、注意事項等重要資訊的說明。在程式的生成和執行階段,註釋的所有資訊都不會產生任何實際作用,因為從編譯器開始註釋的文字都將被忽略。C程式中對程式碼添加註釋有兩種方法。其一是將“//”符號新增到某一行文字的起始段,這樣這整個一行都將被作為註釋處理。另一種方法是通過符號/**/來註釋部分文字,在/*和*/之間的所有字元都將被當做註釋處理,這種註釋方法可以註釋掉一行的部分文字或者多行的文字,甚至可以用在語句的內部。 5、如何對程式進行除錯         單步除錯是程式開發中最為重要的步驟之一。幾乎所有的程式設計師,無論是具有多年經驗的資深工程師,還是初學程式設計的新手,都幾乎不可能一次編寫出沒有任何問題的程式。而單步除錯是解決程式中出現的問題的最佳途徑。在VS中,單步除錯最主要用到的幾個功能是斷點的設定和取消、單步執行跳過、單步執行進入和除錯執行到斷點,分別用快捷鍵F9、F10、F11和F5實現。此外,VS中設定的斷點不僅可以長期生效,也可以對斷點的有效性新增條件,這樣程式只有在執行到斷點所在的語句並且滿足預設的條件時才會中斷,其他時候斷點不發生作用。
設定斷點並除錯執行         另外在除錯執行過程中,還可以對程式碼進行反彙編,檢視程式的彙編程式碼,並且對程式進行彙編指令級的除錯。這項功能在排查很多疑難Bug時非常有效。 反彙編除錯