跳至內容

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;

相同。編譯器只是忽略了大多數空白(除了例如分隔return0 的情況)。但是,通常使用空格(或製表符)來組織原始碼以提高人類可讀性。

大多數情況下,我們不希望其他函式或其他程式設計師的 例程 訪問我們當前正在操作的資料,這就是為什麼瞭解作用域概念很重要。

**作用域**描述了資料片段或函式可見的級別。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),它將文字行輸出到 標準輸出 流。


華夏公益教科書