C 程式設計/預備知識
在學習 C 語法和程式設計結構之前,瞭解一些理解 C 的核心術語非常重要。
接下來,我們將討論 C 程式的**基本結構**。如果您熟悉 PASCAL,您可能聽說過它被稱為**塊結構**語言。C 沒有完全的塊結構(當您詳細瞭解函式時,您將瞭解原因),但瞭解塊是什麼以及如何使用它們仍然非常重要。
那麼**塊**裡面有什麼?一般來說,塊由可執行的**語句**組成。
但在深入瞭解塊之前,讓我們先檢查一下語句。描述語句的一種方式是,它們是編譯器將嘗試將其轉換為可執行指令的文字(以及周圍的空白)。更簡單的定義是,語句是執行某些操作的程式碼片段。例如
int i = 6;
這**宣告**了一個整型變數,可以使用**識別符號** 'i' 來**訪問**它,並將其**初始化**為值 6。各種資料型別在變數 一章中介紹。
您可能已經注意到語句末尾的分號。C 中的語句總是以分號 (;) 結尾。遺漏分號是許多人(包括初學者和專家)常犯的錯誤!因此,在它成為第二天性之前,請務必仔細檢查您的語句!
由於 C 是一種“自由格式”語言,因此多個語句可以在原始檔中的同一行共享,例如
/* this declares the variables 'i', 'test', 'foo', and 'bar'
note that ONLY the variable named 'bar' is initialized to six! */
int i, test, foo, bar = 6;
有幾種型別的語句。您已經看到其中一些,例如賦值(i = 6;)。本書的很大一部分內容都涉及語句的構造。
回到我們對塊的討論。在 C 中,塊以左花括號開始"{"並以右花括號結束"}". 塊可以包含其他塊,這些塊可以包含它們自己的塊,等等。
讓我們看一個塊的例子。
int main(void)
{
/* this is a 'block' */
int i = 5;
{
/* this is also a 'block', nested inside the outer block */
int j = 6;
}
return 0;
}
您可以將塊與前面的語句一起使用,例如主函式宣告(以及我們尚未介紹的其他語句),但您也可以單獨使用塊。
**空白**指的是用於分隔構成原始碼的文字字元的製表符、空格和換行符。
就像生活中很多事情一樣,在它消失之前很難體會空白。對於 C 編譯器來說,原始碼
printf("Hello world"); return 0;
與
printf("Hello world");
return 0;
相同,也與
printf (
"Hello world") ;
return 0;
相同。編譯器只是忽略了大多數空白(除了例如分隔return 和 0 的情況)。但是,通常使用空格(或製表符)來組織原始碼以提高人類可讀性。
大多數情況下,我們不希望其他函式或其他程式設計師的 例程 訪問我們當前正在操作的資料,這就是為什麼瞭解作用域概念很重要。
**作用域**描述了資料片段或函式可見的級別。C 中有兩種作用域,**區域性**和**全域性**。當我們談到**全域性**作用域時,我們指的是可以在程式中的任何位置看到或操作的東西。**區域性**作用域適用於僅在宣告它的塊內可見或可操作的程式元素。
讓我們看一些例子來更好地瞭解作用域。
int i = 5; /* this is a 'global' variable, it can be accessed from anywhere in the program */
/* this is a function, all variables inside of it
are "local" to the function. */
int main(void)
{
int i = 6; /* "local" 'i' is set to 6 */
printf("%d\n", i); /* prints a '6' to the screen, instead of the global variable of 'i', which is 5 */
return 0;
}
這展示了局部和全域性的示例。但是,不同作用域在函式**內部**呢?
(您將在後面瞭解有關函式的更多資訊,現在只關注“main”部分。)
/* the main function */
int main(void)
{
/* this is the beginning of a 'block', you read about those above */
int i = 6; /* this is the first variable of this 'block', 'i' */
{
/* this is a new 'block', and because it's a different block, it has its own scope */
/* this is also a variable called 'i', but in a different 'block',
because it's in a different 'block' than the first variable named 'i', it doesn't affect the first one! */
int i = 5;
printf("%d\n", i); /* prints a '5' onto the screen */
}
/* now we're back into the first block */
printf("%d\n", i); /* prints a '6' onto the screen */
return 0;
}
**函式**是程式設計的重要組成部分。函式是一種特殊的塊,它執行一個定義明確的任務。如果一個函式設計得當,它可以使程式設計師能夠執行一項任務,而無需瞭解該函式的工作原理。請求函式執行其任務的行為稱為**函式呼叫**。許多函式需要函式呼叫來傳遞它執行其任務所需的部分資料;這些被稱為**引數**。許多函式在完成時也會向函式呼叫返回一個值;這被稱為**返回值**(上述程式中的返回值是**0**)。
在呼叫函式之前,您需要知道以下內容
- 函式的作用
- 引數的資料型別(稍後討論)以及它們的含義
- 返回值的資料型別以及它的含義
許多函式使用返回值來表示計算結果。有些函式使用返回值來指示它們是否成功完成了工作。正如您在簡介練習中所見,main 函式使用返回值向作業系統提供退出狀態。
除全域性資料定義和宣告之外的所有程式碼都必須是函式的一部分。
通常,您可以隨時自由地呼叫函式。唯一的限制是每個可執行程式都必須有一個且只有一個**main** 函式,該函式是程式開始執行的地方。
我們將在後面的章節中更詳細地討論函式,C 程式設計/過程和函式。
1983 年,當 C 正在標準化的過程中,美國國家標準協會 (ANSI) 成立了一個委員會來制定 C 的標準規範,稱為“ANSI C”。該標準規範建立了一組每個 C 實現都共有的基本函式集,稱為 標準庫。標準庫提供用於輸入/輸出、字串操作、數學、檔案和記憶體分配等任務的函式。標準庫不提供依賴於特定硬體或作業系統的函式,例如圖形、聲音或網路。在“Hello, World”程式中,使用了一個標準庫函式(printf),它將文字行輸出到 標準輸出 流。