C 程序由各類令牌組成,令牌能夠是關鍵字、標識符、常量、字符串值,或者是一個符號。例如,下面的 C 語句包括五個令牌:html
printf("Hello, World! \n");
編程
這五個令牌分別是:windows
printf ( "Hello, World! \n" ) ;
####分號 ;數組
在 C 程序中,分號是語句結束符。也就是說,每一個語句必須以分號結束。它代表一個邏輯實體的結束。app
####註釋編程語言
C 語言有兩種註釋方式:函數
// 單行註釋 以 // 開始的單行註釋,這種註釋能夠單獨佔一行。
/* 單行註釋 */ /* 多行註釋 多行註釋 多行註釋 */ /* */ 這種格式的註釋能夠單行或多行。
您不能在註釋內嵌套註釋,註釋也不能出如今字符串或字符值中。佈局
####標識符ui
C 標識符是用來標識變量、函數,或任何其餘用戶自定義項目的名稱。一個標識符以字母 A-Z 或 a-z 或下劃線 _ 開始,後跟零個或多個字母、下劃線和數字(0-9)。spa
C 標識符內不容許出現標點字符,好比 @、$ 和 %。C 是區分大小寫的編程語言。所以,在 C 中,Manpower 和 manpower 是兩個不一樣的標識符。
C 中的保留字。不能做爲常量名、變量名或其餘標識符名稱。
####C 中的空格
只包含空格的行,被稱爲空白行,可能帶有註釋,C 編譯器會徹底忽略它。
在 C 中,空格用於描述空白符、製表符、換行符和註釋。空格分隔語句的各個部分,讓編譯器能識別語句中的某個元素(好比 int)在哪裏結束,下一個元素在哪裏開始。所以,在下面的語句中:
int age;
在這裏,int 和 age 之間必須至少有一個空格字符(一般是一個空白符),這樣編譯器纔可以區分它們。另外一方面,在下面的語句中:
fruit = apples + oranges; // 獲取水果的總數
fruit 和 =,或者 = 和 apples 之間的空格字符不是必需的,可是爲了加強可讀性,您能夠根據須要適當增長一些空格。
在 C 語言中,數據類型指的是用於聲明不一樣類型的變量或函數的一個普遍的系統。變量的類型決定了變量存儲佔用的空間,以及如何解釋存儲的位模式。
可分爲如下幾種:
序號 | 類型與描述 |
---|---|
1 | 基本類型: 它們是算術類型,包括兩種類型:整數類型和浮點類型。 |
2 | 枚舉類型: 它們也是算術類型,被用來定義在程序中只能賦予其必定的離散整數值的變量。 |
3 | void 類型: 類型說明符 void 代表沒有可用的值。 |
4 | 派生類型: 它們包括:指針類型、數組類型、結構類型、共用體類型和函數類型。 |
數組類型和結構類型統稱爲聚合類型。函數的類型指的是函數返回值的類型。
下表列出了關於標準整數類型的存儲大小和值範圍的細節:
類型 | 存儲大小 | 值範圍 |
---|---|---|
char | 1 字節 | -128 到 127 或 0 到 255 |
unsigned char | 1 字節 | 0 到 255 |
signed char | 1 字節 | -128 到 127 |
int | 2 或 4 字節 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字節 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字節 | -32,768 到 32,767 |
unsigned short | 2 字節 | 0 到 65,535 |
long | 4 字節 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字節 | 0 到 4,294,967,295 |
注意,各類類型的存儲大小與系統位數有關,但目前通用的以64位系統爲主。
如下列出了32位系統與64位系統的存儲大小的差異(windows 相同):
在Linux中:i686是i386的子集應對高級別CPU的,是32位,x86_64是64位
爲了獲得某個類型或某個變量在特定平臺上的準確大小,您可使用 sizeof 運算符。表達式 sizeof(type) 獲得對象或類型的存儲字節大小。下面的實例演示了獲取 int 類型的大小:
#include <stdio.h> #include <limits.h> int main() { printf("int 存儲大小 : %lu \n", sizeof(int)); return 0; }
當您在 Linux 上編譯並執行上面的程序時,它會產生下列結果:
int 存儲大小 : 4
%lu 爲 32 位無符號整數,詳細說明查看 C 庫函數 - printf()。
下表列出了關於標準浮點類型的存儲大小、值範圍和精度的細節:
類型 | 存儲大小 | 值範圍 | 精度 |
---|---|---|---|
float | 4 字節 | 1.2E-38 到 3.4E+38 | 6 位小數 |
double | 8 字節 | 2.3E-308 到 1.7E+308 | 15 位小數 |
long double | 16 字節 | 3.4E-4932 到 1.1E+4932 | 19 位小數 |
頭文件 float.h 定義了宏,在程序中可使用這些值和其餘有關實數二進制表示的細節。下面的實例將輸出浮點類型佔用的存儲空間以及它的範圍值:
#include <stdio.h> #include <float.h> int main() { printf("float 存儲最大字節數 : %lu \n", sizeof(float)); printf("float 最小值: %E\n", FLT_MIN ); printf("float 最大值: %E\n", FLT_MAX ); printf("精度值: %d\n", FLT_DIG ); return 0; }
%E 爲以指數形式輸出單、雙精度實數,詳細說明查看 C 庫函數 - printf()。
當您在 Linux 上編譯並執行上面的程序時,它會產生下列結果:
float 存儲最大字節數 : 4 float 最小值: 1.175494E-38 float 最大值: 3.402823E+38 精度值: 6
###void 類型
void 類型指定沒有可用的值。它一般用於如下三種狀況下:
序號 | 類型與描述 |
---|---|
1 | 函數返回爲空 C 中有各類函數都不返回值,或者您能夠說它們返回空。不返回值的函數的返回類型爲空。例如 void exit (int status); |
2 | 函數參數爲空 C 中有各類函數不接受任何參數。不帶參數的函數能夠接受一個 void。例如 int rand(void); |
3 | 指針指向 void 類型爲 void * 的指針表明對象的地址,而不是類型。例如,內存分配函數 void *malloc( size_t size ); 返回指向 void 的指針,能夠轉換爲任何數據類型。 |
若是如今仍是沒法徹底理解 void 類型,不用太擔憂,在後續的章節中將會詳細講解這些概念。
變量是程序可操做的存儲區的名稱。C 中每一個變量都有特定的類型,類型決定了變量存儲的大小和佈局,該範圍內的值均可以存儲在內存中,運算符可應用於變量上。
變量的名稱能夠由字母、數字和下劃線字符組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不一樣的,由於 C 是大小寫敏感的。基於前一章講解的基本類型,有如下幾種基本的變量類型:
類型 | 描述 |
---|---|
char | 一般是一個字節(八位)。這是一個整數類型。 |
int | 對機器而言,整數的最天然的大小。 |
float | 單精度浮點值。單精度是這樣的格式,1位符號,8位指數,23位小數。 |
double | 雙精度浮點值。雙精度是1位符號,11位指數,52位小數。 |
void | 表示類型的缺失。 |
###變量定義
變量定義就是告訴編譯器在何處建立變量的存儲,以及如何建立變量的存儲。變量定義指定一個數據類型,幷包含了該類型的一個或多個變量的列表,以下所示:
type variable_list;
在這裏,type 必須是一個有效的 C 數據類型,能夠是 char、int、float、double 或任何用戶自定義的對象,variable_list 能夠由一個或多個標識符名稱組成,多個標識符之間用逗號分隔。下面列出幾個有效的聲明:
int i, j, k; char c, ch; float f, salary; double d;
變量能夠在聲明的時候被初始化(指定一個初始值)
type variable_name = value;
下面列舉幾個實例:
extern int d = 3, f = 5; // d 和 f 的聲明與初始化 int d = 3, f = 5; // 定義並初始化 d 和 f byte z = 22; // 定義並初始化 z char x = 'x'; // 變量 x 的值爲 'x'
沒有初始化時,變量的值時NULL(全部字節的值都是 0)
變量聲明向編譯器保證變量以指定的類型和名稱存在,這樣編譯器在不須要知道變量完整細節的狀況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序鏈接時編譯器須要實際的變量聲明。
變量的聲明有兩種狀況:
extern int i; //聲明,不是定義 int i; //聲明,也是定義
嘗試下面的實例,其中,變量在頭部就已經被聲明,可是定義與初始化在主函數內:
#include <stdio.h> // 函數外定義變量 x 和 y int x; int y; int addtwonum() { // 函數內聲明變量 x 和 y 爲外部變量 extern int x; extern int y; // 給外部變量(全局變量)x 和 y 賦值 x = 1; y = 2; return x+y; } int main() { int result; // 調用函數 addtwonum result = addtwonum(); printf("result 爲: %d",result); return 0; }
執行結果以下:
result 爲: 3
若是須要在一個源文件中引用另一個源文件中定義的變量,咱們只需在引用的文件中將變量加上 extern 關鍵字的聲明便可。
addtwonum.c
#include <stdio.h> /*外部變量聲明*/ extern int x ; extern int y ; int addtwonum() { return x+y; }
test.c
#include <stdio.h> /*定義兩個全局變量*/ int x=1; int y=2; int addtwonum(); int main(void) { int result; result = addtwonum(); printf("result 爲: %d\n",result); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
$ gcc addtwonum.c test.c -o main $ ./main result 爲: 3
C 中有兩種類型的表達式:
變量是左值,所以能夠出如今賦值號的左邊。數值型的字面值是右值,所以不能被賦值,不能出如今賦值號的左邊。
// 下面是一個有效的語句; int g = 20; // 下面這個就不是一個有效的語句,會生成編譯時錯誤; 10 = 20;