C 程式設計基礎/預備知識
首先,一個非常簡單的 C 程式示例
/* Sample C program that outputs the word "Hello" */
#include <stdio.h>
int main()
{
printf("Hello\n");
return 0;
}
上面示例中所示的程式被稱為程式原始碼。原始碼由字母、數字和其他符號組合而成。程式設計師/使用者可以使用任何文字編輯器建立原始碼。
在本課程中,我們將使用以下格式編寫 C 程式
#include <stdio.h>
int main()
{
/* ...your variable declarations... */
/* ...your statements... */
return 0;
}
所有 C 程式都由一系列指令組成。在 C 語言中,指令也被稱為語句。在英語中,語句以句號、問號或感嘆號結束。請注意,在 C 語言中,語句以分號結束。在上面的示例程式中,只有一個語句 - printf() 語句。
所有語句都應寫入使用者定義的函式中。您可以將函式視為一組或一系列語句。這類似於英語,其中一個段落由一系列語句組成。術語“使用者定義”意味著是使用者定義(或編寫)了函式的描述。在上面的示例程式中,只有一個使用者定義的函式 - main() 函式。所有 C 程式都必須具有 main() 函式。
符號 { 被稱為左花括號或左大括號。同樣,符號 } 被稱為右花括號或右大括號。花括號用於分組目的。將左花括號視為與開始同義的東西,將右花括號視為結束的符號。因此,在上面的示例程式中,左花括號和右花括號分別指定了 main() 函式的開始和結束。請注意,花括號必須始終成對出現。缺少花括號是語法錯誤最常見的原因之一。
正如我們將在後面看到的那樣,花括號用於對多個語句進行分組。
符號 /* 和 */ 用於對程式中的註釋進行分組。註釋不是指令,而是僅提供其他資訊(文字描述),例如程式正在做什麼、輸入是什麼、輸出是什麼等。將 /* 視為註釋的開始,將 */ 視為註釋的結束。就像花括號一樣,這些符號始終成對出現。註釋是可選的,可以放置在程式原始碼的任何位置。
可以在 /* */ 中編寫多行註釋。例如
/* The following is
an example
of a very simple C program */
void main()
{
printf("Hello\n");
}
請注意,註釋不能巢狀,這意味著您不能將 /* */ 放入 /* */ 中。例如,以下示例是錯誤的
/*
this is a comment
/* this is one more comment - which will cause an error */
*/
其他符號,即 #include <stdio.h> 和 void 的含義將在後面解釋。
資料和操作資料的指令用它們的名字來指代。在 C 語言中,為某事物命名有一些規則和約定;它們如下所示
1. 名稱由字母和數字組成。
2. 第一個字元必須是字母。
3. C 語言區分大小寫,這意味著小寫字母 'a' 與大寫字母 'A' 不同。
4. 下劃線符號 _ 在 C 語言中被視為字母。但是,不建議將其用作名稱的第一個字元。
5. 至少名稱的前 31 個字元是有效的。
示例
以下是有效的名稱示例
a
A
main
void
hello
salary
rate_per_hour
student_1
student_2
student_3
First_Name
ComputeGrade
以下是無效的名稱示例
1 /* must start with a character */
1_ab /* must start with a character */
a& /* & symbol cannot be used in a name */
xyz_% /* % symbol cannot be used in a name */
$money /* must start with a character,
$ cannot be used in a name */
作為一種語言,C 語言有自己的詞彙表 - 一組關鍵字。這些名稱是保留的,不能用於其他目的,例如命名使用者定義的變數名稱。在示例程式中,名稱 void 是一個關鍵字。
ANSI C 語言有 32 個關鍵字(僅此而已)。
請注意,printf 這個名字實際上不是 C 關鍵字,也不真正屬於 C 語言的一部分。它是一個標準輸入/輸出庫中預定義的名稱。這些區別將在後面解釋。
常量是指其值不會改變的實體。常量可以是數字常量或字面常量。
示例
數字常量的示例
1
500
-10000.100
3.1416
字面常量的示例
'A'
"Hello"
"The quick brown fox jumped over the lazy dog."
注意:在 C 中,僅包含一個字元的字面常量簡稱為字元。它以一對單引號包圍的方式編寫。如果包含多個字元,則稱為字串。字串以一對雙引號包圍的方式編寫。
程式由資料和操作這些資料的指令組成。請注意,資料必須儲存在某個地方,因此需要在 RAM 中使用一些記憶體空間。
變數是指用於儲存資料的實體。如果沒有變數,就沒有辦法(或者實際上沒有地方)儲存資料。變數具有
- 一個名稱(更準確地說是一個符號名稱)
- 一個關聯的物理記憶體空間(RAM 中的一部分)
- 一個數據型別
- 一個值(取決於資料型別)
- 一個作用域
- 一個生命週期
作用域和生命週期的概念將在課程的後半部分討論。
資料型別指定了
- 該型別變數可以取值的種類
- 該型別變數可以取值的範圍
- 變數儲存該型別值所需的記憶體量(以位元組為單位)
有四種基本資料型別,分別是
- char - 字元資料型別。 char 資料型別用於表示/儲存/操作字元資料值。一個 char 資料型別值需要一個位元組的記憶體空間。 char 值可以取值的範圍是 0 到 255。所使用的數字到字元編碼是 ASCII。
- int - 整數資料型別。 int 資料型別用於表示/儲存/操作帶符號的整數值。
- float - 單精度浮點數資料型別。 float 資料型別用於儲存單精度帶符號實數(即帶小數點的數字)。
- double - 雙精度浮點數資料型別。 double 資料型別用於儲存雙精度帶符號實數(即帶小數點的更大數字)。
儲存一個 int、一個 float 和一個 double 所需的記憶體空間量取決於平臺(取決於機器和軟體)。對於 32 位機器(以及 32 位編譯器,如 Microsoft C 編譯器),一個 int 和一個 float 分別需要 4 個位元組的記憶體,而一個 double 需要 8 個位元組的記憶體。
請注意,char 資料實際上是數字(0 到 255),並且被視為 int 值的子集。對整數執行的任何操作(稍後討論)也可以對字元執行。
作業
找出以下資料型別在您的平臺上的值範圍(最小值和最大值): int、float、double。提示:嘗試查詢您的 C 編譯器附帶的兩個名為 "limits.h" 和 "float.h" 的檔案。
可以使用以下程式列印基本資料型別的大小
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Size of char: %d\n", sizeof(char));
printf("Size of int: %d\n", sizeof(int));
printf("Size of float: %d\n", sizeof(float));
printf("Size of double: %d\n", sizeof(double));
_getch();
return 0;
}
sizeof 是 C 中的一個關鍵字。它是一個運算子,它返回上面指定資料型別的大小(以位元組為單位)。
變數宣告是將變數“引入”到程式/函式中的“操作”。C 程式中的所有變數都必須宣告。如果您忘記這樣做,編譯器將報告語法錯誤。
在 C 中,宣告變數的語法如下
<資料型別> <變數名>
符號 <item> 表示需要指定括在尖括號中的專案。分號表示宣告的結尾。缺少分號會導致編譯器生成語法錯誤。變數應遵循 C 命名約定。
示例
char ch;
int i;
float f;
double d;
可以在同一行上宣告幾種相同型別變數。在這種情況下,兩個變數之間應該插入一個逗號。缺少逗號會導致編譯器生成語法錯誤。
示例: <syntaxhighlight lang="c" char ch1, ch2;
int x, y, z;
float hourly_rate, number_of_hours, salary;
double numerator, denominator; </syntaxhighlight>
可以,只要您遵循命名約定,並且不使用 C 保留字。
但是,建議您作為良好的程式設計實踐,使用描述性或暗示性的名稱。例如,如果您知道變數將代表兼職工人的時薪,那麼不要使用諸如 xyz 或 x1 之類的名稱。最好使用諸如 rate 或 hourly_rate 之類的變數名。請注意,使用下劃線使變數名更容易閱讀。
預設情況下,C 中變數的值是垃圾,這意味著該記憶體空間中儲存著某些內容,但這些內容對於預期用途無效。
必須正確初始化變數。透過初始化,是指為變數分配有效值。使用具有垃圾值的變數會導致邏輯錯誤,這是一種非常難以發現的錯誤型別。
練習
1. 宣告中間名首字母為字元變數
2. 宣告年齡為整型變數
3. 宣告存款金額、取款金額為浮點型變數
4. 宣告長度、寬度、高度為雙精度資料型別變數