博客 / 詳情

返回

[C程序設計] 02 - 數據類型

一、常量與變量

1. 常量

  1. 整形常量
  2. 實型常量

    • 十進制小數形式
    • 指數形式:\(12.34e3\)(代表\(12.34\times 10^3\))
  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 字符
  4. 字符串:用雙引號表示
  5. 符號變量:用 #define 指令,指定用一個符號代表一個常量

    #define PI 3.1416

符號常量不是變量!符號常量不佔用內存,只是作為一個臨時符號,代表一個值,在預編譯後這個符號就不存在了,一次不能對符號變量重新賦值。為與變量名區別,習慣上符號常量用大寫字母表示。

2. 變量

變量必須先定義後使用。變量名實際是以一個名字代表的存儲地址。編譯時,系統給每一個變量名分配對應的內存地址。從表變量中取值,實際上是通過變量名找到對應的內存地址,從該存儲單元中讀取數據。

3. 常變量

C99 標準允許使用常變量,方法是定義變量時在前面加一個 const,該變量存在期間其值不能改變。

常變量與常量:

  • 常變量具有變量的基本屬性:有類型,佔存儲單元,只是不允許改變值。
  • 常變量是有名字的不變量,常量是無名字的不變量。

常變量與符號變量:

  • 符號變量是預編譯指令,它只是用符號常量代表一個字符串,在預編譯時僅進行字符替換,編譯後符號常量就不存在了(被值代替),符號常量的名字不分配存儲單元。
  • 串並聯佔用存儲單元,有變量值,只是不能改變。
  • 從使用上看,常變量具有符號變量的優點,而且使用更方便,有常變量時可以不使用符號常量。但有些編譯系統還未實現 C99 的功能,不能使用常變量。

4. 標識符

用來對常量名、函數、數組、類型等命名的有效字符序列統稱為標識符(identifier)。標識符就是一個對象的名字。

C 語言規定標識符只能由字母、下劃線、數字組成,且第一個字符必須為字母。大小寫字母是兩個不同的字符。習慣上變量名使用小寫字母。

二、數據類型

類型是指對數據分配存儲單元的安排,包括存儲單元的長度(佔多少字節)一級數據的存儲方式。不同的類型分配不同的長度和儲存形式。
計算機進行的計算不是抽象的理論值的計算,而是用工程的方法實現的計算,在許多情況下只能得到近似的結果。
C99 允許使用的類型包括:
C語言數據類型
基本類型和枚舉類型的變量都是數值,統稱為算術類型(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。有符號整形的最高位表示數值的符號,如果指定為無符號類型,則存儲單元中所有的二進制位都用來存放數據本身,因此無符號整形可以存放的正數範圍比有符號整型擴大一倍。
只有整型數據可以用 signedunsigned 修飾,實型數據不能。無符號整型數據用 %u 格式輸出。

2. 字符型

由於字符型是按照其代碼形式存儲的,因此 C99 把字符型數據作為整型數據的一種。
各種字符集(包括 ASCII 字符集)的基本集都包括 127 個字符:

  • 大小寫字母。
  • 數字:0-9。
  • 專門符號 29 個:! & < 等。
  • 空格符:空格、製表符、換行符等。
  • 不能顯示的字符:空(null)字符 \0、警告、退格等。

以類型符 char 定義字符變量,可以將 0-127 之間的整數賦值給字符變量,輸出時也可以選擇以十進制整數形式或字符形式輸出。

char c;
c = 64;
printf("%d %c\n", c, c);

// 64 @

字符類型屬於整數類型,可以使用 signedunsigned 修飾。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 doubledouble 的處理方式一樣,都分配 8 個字節。

三、運算符和表達式

C 語言提供以下運算符:

  • 算術運算符:+ - * / % ++ --
  • 關係運算符:> < == >= <= !=
  • 邏輯運算符:! && ||
  • 位運算符:<< >> ~ | ^ &
  • 賦值運算符:=
  • 條件運算符:?:
  • 逗號運算符:,
  • 指針運算符:* &
  • 求字節運算符:sizeof
  • 強制類型運算轉換符:(type)
  • 成員運算符:. ->
  • 下標運算符:[]
  • 其他:如函數調用運算符 ()

1. 基本算數運算符

運算符 含義
+ 正號或加法
- 負號或減法
* 乘號
/ 除號
% 取餘

兩個實數相除,結果為雙精度實數。兩個整數相除,結果位整數,捨去小數部分,但如果結果為負數,捨去的方向是不一定的,由編譯系統決定。多數編譯系統採取“向零取整”的方法,即取整後向零靠攏。

2. 自增自減運算符

自增和自減運算符的作用是使變量的值加 1 或減 1:

  • ++i--i:使用 i 之前,先使 i 的值加(減)1
  • i++i--:使用 i 之後,使 i 的值加(減)1
int i = 3;
printf("%d\t", i++);
printf("%d\n", ++i);

// 3    5

3. 算術表達式與運算符的優先級與結合性

C 語言規定運算符是優先級:如先乘除後加減。

如果一個運算對象兩側的運算符優先級相同,則按規定的“結合方向”處理:算術運算符的結合方向都是自左向右,賦值運算符的結合方向是自右向左。“結合性”是 C 語言獨有的特性之一。

4. 不同數據類型的混合運算

  • 運算的兩個數中有 floatdouble 時,結果位 double
  • 字符型數據與整型或實型數據進行運算時,會先將字符型轉換為整型或實型。

5. 強制類型轉換符

使用 (類型)(表達式) 可以將一個表達式強制轉換為所需的形式。

(float)(5%3)

Reference:

譚浩強《C程序設計(第五版)》

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.