變量和常量
標識符
在計算機高級語言中,用來對變量、符號常量、函數、數組、類型等命名的有效字符序列統稱為標識符(identifier)。
C語言規定標識符:
- 只能由字母,數字和下劃線組成。
- 不能以數字開頭。
- 字母區分大小寫。
不能與關鍵字和保留字重復。
在傳統C語言用法中,一般常量都使用大寫字母,變量都使用小寫字母。
變量
聲明變量
所有變量都必須先聲明后使用,盡管某些變量可以通過上下文隱式地聲明。
聲明變量的一般形式:
數據類型 變量名列表;
一個聲明指定一種變量類型,后面所帶的變量表可以包含一個或多個該類型的變量。
short int a,b,i; //有符號短整型變量
unsigned char c; //無符號字符型變量
一個聲明語句中的多個變量可以拆開在多個聲明語句中聲明。
short int a;
short int b;
short int i;
unsigned char c;
在聲明變量后,應對該變量進行初始化。
初始化變量就是為變量賦一個初始值,只需在變量名后面加上賦值運算符=
和應賦給變量的值。
short int a;
a = 10;
unsigned char c;
c = 'A';
可以在聲明的同時對變量進行初始化。
short int a = 10;
unsigned char c = 'A';
不應將初始化的變量和未初始化的變量放在同一條聲明中。
short int a,b = 10; //a未初始化,b初始化為10
常量
在程序運行過程中,其值不能被改變的量稱為常量。
從字面形式上即可識別的常量稱為“字面常量”或“直接常量”,即字面常量是沒有名字的不變量。
整數常量
可以把整數常量寫作十進制、八進制和十六進制。
- 十進制:常量包含 0~9 中的數字,但是一定不能以 0 開頭。
- 八進制:常量包含 0~7 中的數字,必須以 0 開頭。
- 十六進制:常量包含 0~9 中的數字和 a~f 中的字母,總是以 0x 開頭。
十六進制整數常量中的字母可以是大寫字母也可以是小寫字母。
整數常量的類型通常為 int,如果整數太大超出了范圍,則轉換成其它范圍足夠大的整數類型。
可以強制編譯器把整數常量作為長整數,需在后邊加上字母L
(或l
)。
可以強制編譯器把整數常量作為雙長整數,需在后邊加上字母LL
(或ll
)。
可以指明整數常量是無符號的,需在常量后邊加上字母U
(或u
)。
浮點型常量
浮點型常量可以寫作為科學計數形式或指數形式。
- 科學計數形式:十進制小數。
- 指數形式:需要在指數數值前放置字母
E
(或e
);eN
(或e+N
)表示 10 的 N 次方,e-N
表示 10 的負 N 次方。
默認情況下,浮點型常量都以雙精度數的形式存儲。
為了說明浮點型常量是單精度的,需在常量后邊加上字母F
(或f
)。
為了說明浮點型常量是擴展精度的,需在常量后邊加上字母L
(或l
)。
字符常量
單引號括起來的單個字符稱為字符常量。
C語言字符常量通常以ASCII
碼值的形式存儲。
常用的字符常量ASCII
碼值:
- 大寫字母
'A'
的ASCII
碼值為 65。 - 小寫字母
'a'
的ASCII
碼值為 97。
轉義序列
以\
開頭的字符序列稱為轉義字符。
C語言規定的轉義序列包括:
轉義字符 | 描述 | ASCII 碼值 |
---|---|---|
\a | 響鈴 | 0x07 |
\n | 換行 | 0x0a |
\t | 水平制表(跳到下一個tab位置) | 0x09 |
\b | 退格,將當前位置移到前一列 | 0x08 |
\r | 回車,將當前位置移到本行開頭 | 0x0d |
\f | 換頁,將當前位置移到下頁開頭 | 0x0c |
\v | 豎向跳格 | 0x0b |
\\ | 反斜杠字符 | 0x5c |
\’ | 單引號字符 | 0x27 |
\" | 雙引號字符 | 0x22 |
\0 | 空字符 | 0x00 |
\ddd | 位任意八進制值 | nnn |
\xhh | 位任意十六進制值 | nn |
宏定義
簡單的宏
符號常量:用#define
指令,指定用一個符號名稱代表一個常量。
簡單的宏(C標準中稱為對象式宏)的定義有如下格式:
#define 標識符 替換列表
宏的替換列表可以包括標識符、關鍵字、數值常量、字符常量、字符串字面量、操作符和排列。
當預處理器遇到一個宏定義時,會做一個“標識符”代表“替換列表”的記錄。在文件后面的內容中,不管標識符在哪里出現,預處理器都會用替換列表代替它。
例:
#define N 100
#define PI 3.1419
#define CR '\r'
#define EOS '\0'
帶參數的宏
帶參數的宏(也稱為函數式宏)的定義有如下格式:
#define 標識符(參數列表) 替換列表
在宏的名字和左括號之間必須沒有空格。如果有空格,預處理器會認為是在定義一個簡單的宏。
帶參數的宏可以包含空的參數列表。
例:
#define MAX(x,y) ((x)>(y))?(x):(y))
#define IS_EVEN(n) ((n)%2==0)
現在如果后面的程序中有如下語句:
i = MAX(j + k,m - n);
預處理器會將這些行替換為:
i = ( (j+k) > (m-n) ? (j+k) : (m-n) );