首頁 > 軟體

C語言的位元欄與列舉詳解

2022-02-09 13:00:08

1.什麼是位元欄? 

位元欄的宣告和結構是類似的,有兩個不同: 

①位元欄的成員必須是 int、unsigned int 或signed int 

②位元欄的成員名後邊有一個冒號和一個數位 

例如:

struct A
{
        //4byte=32bit    int 4個位元組
        //開闢4個位元組
        int _a : 2 ;//30(分配了2位元組,還剩30位元組)
        int _b : 5 ;//25
        int _c : 10 ;//15
        //在開闢4個位元組
        int _d : 30 ;//超出剩餘的開闢記憶體大小,根據C標準可能用前面的15位元組在開闢15位元組                             //也可能不用重新開闢30位元組
};

 簡言之:位元欄就是規定變數佔的位元位!

2.位元欄的記憶體分配、跨平臺與使用 

特別提醒: 

1. 位元欄的成員可以是 int unsigned int signed int 或者是 char (屬於整形家族)型別 

2. 位元欄的空間上是按照需要以4個位元組( int )或者1個位元組( char )的方式(char準確來說是int型別,反組合內部處理為int)來開闢的

3. 位元欄涉及很多不確定因素,位元欄是不跨平臺的,注重可移植的程式應該避免使用位元欄(問題在於多餘記憶體使用和開闢上) 例如:

struct S {
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10; 
s.b = 12; 
s.c = 3;
s.d = 4;

 位元欄的跨平臺問題:

1. int 位元欄被當成有符號數還是無符號數是不確定的。 

2. 位元欄中最大位的數目不能確定。(16位元機器最大16,32位元機器最大32,寫成27,在16位元機 器會出問題。 

3. 位元欄中的成員在記憶體中從左向右分配,還是從右向左分配標準尚未定義。 

4. 當一個結構包含兩個位元欄,第二個位元欄成員比較大,無法容納於第一個位元欄剩餘的位時,是 捨棄剩餘的位還是利用,這是不確確定的。 

總結: 跟結構相比,位元欄可以達到同樣的效果,但是可以很好的節省空間,但是有跨平臺的問題存在 

位元欄的應用: 

3.什麼是列舉? 

列舉顧名思義就是一一列舉。 

把可能的取值一一列舉。 

例如:

//(可能取值都是有值的,預設從0開始,一次遞增1,當然在定義的時候也可以賦初值)
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性別
{
MALE,
FEMALE,
SECRET
};
enum Color//顏色
{
RED,
GREEN,
BLUE
};
//以上定義的 enum Day , enum Sex , enum Color 都是列舉型別
//{}中的內容是列舉型別的可能取值,也叫列舉常數
//列舉的初始化
enum Color//顏色
{
RED=1,
GREEN=2,
BLUE=4
};
 

4.列舉的優點與使用 

我們可以使用 #define 定義常數,為什麼非要使用列舉? 

列舉的優點: 

1. 增加程式碼的可讀性和可維護性

2. 和 #define 定義的識別符號比較列舉有型別檢查,更加嚴謹。

3. 防止了命名汙染(封裝)

4. 便於偵錯

5. 使用方便,一次可以定義多個常數 

列舉的使用:

enum Color // 顏色
{
RED = 1 ,
GREEN = 2 ,
BLUE = 4
};
enum Color clr = GREEN ; // 只能拿列舉常數給列舉變數賦值,才不會出現型別的差異。
clr = 5;               //這樣是錯誤的!

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!      


IT145.com E-mail:sddin#qq.com