一、常量與變量
1. 常量
- 整形常量
-
實型常量
- 十進制小數形式
- 指數形式:\(12.34e3\)(代表\(12.34\times 10^3\))
-
字符常量
- 普通字符:用單引號表示,單引號裏只能有一個字符。字符變量以 ASCII 代碼的形式儲存
-
轉義字符
轉義字符 字符值 輸出結果 \\a警告 alert 產生視覺或聲音信號 \\b退格 backspace 將光標當前位置後退一個字符 \\f換頁 form feed 將光標位置移到下一頁開頭 \\n換行 將光標位置移到下一行開頭 \\r回車 carriage return 將光標位置移到本行開頭 \\t水平製表符 將光標位置移到下一個 Tab 位置 \\v垂直製表符 將光標位置移到下一個垂直製表符對齊點 \\o或\\oo或\\ooo(其中o代表一個八進制數字)與該八進制碼對應的 ASCII 字符 \\xh[h...](其中h代表一個十六進制數字)與該十六進制碼對應的 ASCII 字符
- 字符串:用雙引號表示
-
符號變量:用
#define指令,指定用一個符號代表一個常量#define PI 3.1416
符號常量不是變量!符號常量不佔用內存,只是作為一個臨時符號,代表一個值,在預編譯後這個符號就不存在了,一次不能對符號變量重新賦值。為與變量名區別,習慣上符號常量用大寫字母表示。
2. 變量
變量必須先定義後使用。變量名實際是以一個名字代表的存儲地址。編譯時,系統給每一個變量名分配對應的內存地址。從表變量中取值,實際上是通過變量名找到對應的內存地址,從該存儲單元中讀取數據。
3. 常變量
C99 標準允許使用常變量,方法是定義變量時在前面加一個 const,該變量存在期間其值不能改變。
常變量與常量:
- 常變量具有變量的基本屬性:有類型,佔存儲單元,只是不允許改變值。
- 常變量是有名字的不變量,常量是無名字的不變量。
常變量與符號變量:
- 符號變量是預編譯指令,它只是用符號常量代表一個字符串,在預編譯時僅進行字符替換,編譯後符號常量就不存在了(被值代替),符號常量的名字不分配存儲單元。
- 串並聯佔用存儲單元,有變量值,只是不能改變。
- 從使用上看,常變量具有符號變量的優點,而且使用更方便,有常變量時可以不使用符號常量。但有些編譯系統還未實現 C99 的功能,不能使用常變量。
4. 標識符
用來對常量名、函數、數組、類型等命名的有效字符序列統稱為標識符(identifier)。標識符就是一個對象的名字。
C 語言規定標識符只能由字母、下劃線、數字組成,且第一個字符必須為字母。大小寫字母是兩個不同的字符。習慣上變量名使用小寫字母。
二、數據類型
類型是指對數據分配存儲單元的安排,包括存儲單元的長度(佔多少字節)一級數據的存儲方式。不同的類型分配不同的長度和儲存形式。
計算機進行的計算不是抽象的理論值的計算,而是用工程的方法實現的計算,在許多情況下只能得到近似的結果。
C99 允許使用的類型包括:
基本類型和枚舉類型的變量都是數值,統稱為算術類型(arithmetic type)。算術類型和指針類型的變量都是用數字來表示的,統稱為純量類型(scalar type)。枚舉類型是程序中用户自定義的整數類型。數組類型和結構體類型統稱為組合類型(aggregate type)。共用體類型不屬於組合類型,因為在同一時間內只有一個成員具有值。
1. 整形
C 標準沒有規定各種類型數據佔用的存儲單元長度,這是由編譯系統自行決定的。如 Turbo C 2.0 為每個 int 分配 2 個字節(16 個二進位),而 Visual C++ 分配 4 個字節(32 個二進位)。C 標準只要求 long 型數據長度不短於 int 型,short 型不長於 int 型,long long 型最長。
可以使用 sizeof(int) 來查看類型或變量的長度。將一個程序移植到另一個系統時,要注意由於編譯系統的不同引起的數據溢出。
存儲單元存儲整數的方法是:使用整數的補碼(complement)。
- 一個正數的補碼是其二進制形式。
- 求負數的補碼,先將其絕對值寫成二進制形式,讓後對其二進制按位取反,再加 1
在儲存整數的儲存單元中,最左邊的一位是用來表示符號的,如果為 0,表示數值為正;如果為 1,表示數值為負。由此可以得到整數型數據的範圍(按 Visual C++):
| 類型 | 字節數 | 取值範圍 |
|---|---|---|
基本整型 int |
4 | \(-2^{31} \sim (2^{31}-1)\) |
無符號基本整型 unsigned int |
4 | \(0\sim (2^{32}-1)\) |
短整型 short |
2 | \(-2^{15}\sim (2^{15}-1)\) |
無符號短整型 unsigned short |
2 | \(0\sim (2^{16}-1)\) |
長整型 long |
4 | \(-2^{31} \sim (2^{31}-1)\) |
無符號長整型 unsigned long |
4 | \(0\sim (2^{32}-1)\) |
雙長型 long long |
8 | \(-2^{63}\sim (2^{63}-1)\) |
無符號雙長型 unsigned long long |
8 | \(0\sim (2^{64}-1)\) |
修飾符 unsigned 表示無符號類型,即只能取正值。使用 signed 表示有符號類型,通常省略 signed。有符號整形的最高位表示數值的符號,如果指定為無符號類型,則存儲單元中所有的二進制位都用來存放數據本身,因此無符號整形可以存放的正數範圍比有符號整型擴大一倍。
只有整型數據可以用 signed 和 unsigned 修飾,實型數據不能。無符號整型數據用 %u 格式輸出。
2. 字符型
由於字符型是按照其代碼形式存儲的,因此 C99 把字符型數據作為整型數據的一種。
各種字符集(包括 ASCII 字符集)的基本集都包括 127 個字符:
- 大小寫字母。
- 數字:0-9。
- 專門符號 29 個:! & < 等。
- 空格符:空格、製表符、換行符等。
- 不能顯示的字符:空(null)字符
\0、警告、退格等。
以類型符 char 定義字符變量,可以將 0-127 之間的整數賦值給字符變量,輸出時也可以選擇以十進制整數形式或字符形式輸出。
char c;
c = 64;
printf("%d %c\n", c, c);
// 64 @
字符類型屬於整數類型,可以使用 signed 和 unsigned 修飾。127 個字符可以用 7 個二進位來表示,C 語言中指定用一個字節(8 位)儲存一個字符(所有系統都不例外),此時,字節中的第一位置為 0。有些系統提供的字符集拓展到了 255 個字符,此時需要把二進位中不用的那一位用起來,把 char 修改為 unsigned char。
3. 浮點型
浮點型數據表示具有小數點的實數。C 語言中實數是以指數的形式放在存儲單元的,由於一個實數的的指數形式不止一種,即小數點是可以浮動的,因此稱為浮點型。
編譯系統位 float 型變量分配 4 個字節,將小數部分和指數部分分別存放,4 個字節(32 位)中小數部分和指數部分分別佔多少位由編譯系統自行決定。由於用二進制表示一個實數以及存儲單元長度有限,因此不可能得到完全精確的值。小數部分位數越多,精度越高;指數部分位數越多,能表示的數據範圍越大。float 型數據能得到 6 位有效數字,數值範圍為 \(-3.4\times 10^{-38} \sim 3.4 \times 10^{38}\)。
為了擴大能表示的數據範圍,用 8 個字節儲存一個 double 型數據,可以得到 15 位有效數字,數值範圍位\( -1.7\times 10^{-308} \sim 1.7 \times 10^{308} \)。為了提高計算精度,C 語言在進行浮點數的算術運算時,將 float 型數據都自動轉為 double 型數據,然後進行運算。
不同的編譯系統對 long double 的處理方式不同。Turbo C 對 long double 型分配 16 個字節,而 Visual C++對 long double 和 double 的處理方式一樣,都分配 8 個字節。
三、運算符和表達式
C 語言提供以下運算符:
- 算術運算符:
+ - * / % ++ -- - 關係運算符:
> < == >= <= != - 邏輯運算符:
! && || - 位運算符:
<< >> ~ | ^ & - 賦值運算符:
= - 條件運算符:
?: - 逗號運算符:
, - 指針運算符:
* & - 求字節運算符:
sizeof - 強制類型運算轉換符:
(type) - 成員運算符:
. -> - 下標運算符:
[] - 其他:如函數調用運算符
()
1. 基本算數運算符
| 運算符 | 含義 |
|---|---|
+ |
正號或加法 |
- |
負號或減法 |
* |
乘號 |
/ |
除號 |
% |
取餘 |
兩個實數相除,結果為雙精度實數。兩個整數相除,結果位整數,捨去小數部分,但如果結果為負數,捨去的方向是不一定的,由編譯系統決定。多數編譯系統採取“向零取整”的方法,即取整後向零靠攏。
2. 自增自減運算符
自增和自減運算符的作用是使變量的值加 1 或減 1:
++i,--i:使用i之前,先使i的值加(減)1i++,i--:使用i之後,使i的值加(減)1
int i = 3;
printf("%d\t", i++);
printf("%d\n", ++i);
// 3 5
3. 算術表達式與運算符的優先級與結合性
C 語言規定運算符是優先級:如先乘除後加減。
如果一個運算對象兩側的運算符優先級相同,則按規定的“結合方向”處理:算術運算符的結合方向都是自左向右,賦值運算符的結合方向是自右向左。“結合性”是 C 語言獨有的特性之一。
4. 不同數據類型的混合運算
- 運算的兩個數中有
float或double時,結果位double。 - 字符型數據與整型或實型數據進行運算時,會先將字符型轉換為整型或實型。
5. 強制類型轉換符
使用 (類型)(表達式) 可以將一個表達式強制轉換為所需的形式。
(float)(5%3)
Reference:
譚浩強《C程序設計(第五版)》