C語言之基本概念

翟志軍發表於2019-05-14

申明:我在5年前學過C,考過二級C,並取得“優秀”。後來就再也沒有用過。我現在是重新學。所以,我的理解不一定是正確的。望斧正!

本文是在看《C語言程式設計——現代方法》第二章的筆記。

C程式的3個關鍵的語言特性

  • 指令
  • 函式
  • 語句

指令

指令:在編譯操作前修改程式的編輯命令。

這個指令讓我感覺這是將構建工具的部分職責加入到程式原始碼中。因為像條件編譯這些指令做的事情,我個人覺得本應是構建工具的事情。

在編譯C程式之前,前處理器會根據指令對C程式進行編輯。所有指令都是以#開始的。

函式

函式:被命名的可執行程式碼塊。

函式的超集就是C程式。函式分為兩類:

  • 程式設計師編寫的函式
  • 庫函式(由編譯器提供)

術語“函式”來源於數學。在數學中函式是一條根據一個或多個給定引數進行數值計算的規則。

C程式至少包含一個main函式。在執行程式時系統會自動呼叫main函式。main函式是一個程式的入口。main的名稱是規定死的,且區分大小寫。

疑問

為什麼執行程式時系統會自動呼叫main函式?是因為C編譯器編譯時將main函式解析到紙帶的開始處。紙帶指老一輩程式設計師將程式碼打成有孔的紙帶來執行。好心的同學能否解答下?

疑問

“函式(function)”和“方法(method)”這兩個概念之間的區別又是?

語句

語句:程式執行時執行的命令。

語句的超集就是函式。語句必須以分號結束。為什麼呢?因為語句可以連續佔用多行,所以很難確定它的結束位置,因此用分號來向編譯器顯示語句的結束位置。

疑問

強制每條語句使用分號結尾,這是編譯器不夠智慧還是?

變數和賦值

變數

變數:代表資料的儲存空間。

程式一般會執行一系列的計算,因此需要在程式執行過程中有一種臨時儲存資料的方法。一種辦法就是找一個地方來存這些臨時資料。這個地方本質上是記憶體或磁碟等儲存介質。但是我們程式設計師在寫程式碼時總要考慮應該將這個臨時資料儲存到500G日立磁碟上的第2000還是第3000的位置上吧?這時,就建立起一個抽象概念:變數(variable)。變數實際就是儲存介質的一塊空間。在使用變數時,你不需要再考慮這個變數所對映到的介質空間在哪。而變數名則是給這個空間起一個名字,便於人閱讀。與街道上的門牌號的作用類似。

型別

型別:用來說明變數所儲存的資料的種類。通常我們說變數的型別,而不是說資料的種類

因為資料又分很多種:數字、字元、二進位制……所以,就有了型別的概念,而編譯器根據型別來生成最終機器執行的機器碼。如果型別不正確,生成的機器碼執行起來當然會出問題。(個人憑感覺推理,不代表事實)。

型別會影響變數的儲存方式以及允許對變數採取的操作。

宣告

在使用變數之前必須對其進行宣告,這也是為了便於編譯器工作

疑問

為什麼在使用變數之前一定要宣告?如果編譯器足夠聰明,是不是不需要使用前申明?

宣告變數的格式:變數型別 變數名。如int height,int為變數型別,height為變數名。

必須把宣告放置在使用它的語句前:

    main(){
        宣告
        語句
    }

賦值

賦值是一種動作即將資料存入儲存介質中,也就是將資料存入變數中。

通常情況下,賦值運算的右側可以是一個含有常量、變數和運算子的公式(也就是表示式,expression)。

初始化

變數所對映到空間不一定就是空的(用0來填滿的)。很可能是已經存在資料的。按我之前的經驗,如果初始化的成本不大,儘量對每個變數進行初始化。

我在看別人原始碼的時候,發現初始化有兩種風格:

    int height = 8, length = 12, width = 10;

    int height = 8;
    int length = 12;
    int width  = 10;

第一種更簡短,第二種更可讀。如何權衡看自己。

讀入輸出

為獲取輸入,使用scanf函式,輸出時則使用printf。scanf和printf的字母f 都是“格式化”的意思。這兩個函式都需要使用格式串來說明輸入或輸出資料的樣式。就是指使用者必須使用scanf規定的格式輸入,否則會出錯。而輸出要按指定的格式輸出就很容易理解了。

定義常量

常量(constant)是在程式執行過程中固定不變的量。

當程式含有常量時,建議給這些常量命名。這正是提高程式碼可讀性的方法。

在C中定義常量需要使用指令。這個指令就是巨集定義(macro definition):#define。如:

    #define CUBIC_IN_PER_LB 166

個人理解:巨集定義就是在預編譯期進行“替換”,所以,某個C檔案中所有的“CUBIC_IN_PER_LB”識別符號都會被替換為“166”。而“識別符號”的含義在下一節說明。

注意:大多數C程式設計師都遵循的常量名規範是常量名都只用大寫字母。

識別符號

在編寫程式時,需要對變數、函式、巨集和其他實體進行命名。這些名字稱為識別符號(identifier)

合法的識別符號可以是字母、數字和下劃線,但必須以字母或者下劃線開頭。標準C對識別符號的最大長度沒有限制。

C語言是區分大小寫的。

關鍵字

有些詞對編譯器而言有特殊意義,這些詞不能作為識別符號來使用。這些詞稱為關鍵字(keyword)

注意:某些詞對某個編譯器是關鍵字,而對於另一個編譯器則可能不是關鍵字。

C語言程式的佈局

這個就沒有什麼好說的,我覺得是編碼規範問題。可以在團隊層面或公司層面進行統一。在看過這篇文章前,我是不贊成統一編碼規範。如果感興趣,你也可以看看!

相關文章