C語言 列舉與位運算

2021-05-28 17:28:24 字數 2658 閱讀 1380

在實際問題中, 有些變數的取值被限定在乙個有限的範圍內。例如,乙個星期內只有七天,一年只有十二個月, 乙個班每週有六門課程等等。如果把這些量說明為整型, 字元型或其它型別顯然是不妥當的。 為此,c語言提供了一種稱為「列舉」的型別。在「列舉」型別的定義中列舉出所有可能的取值, 被說明為該「列舉」型別的變數取值不能超過定義的範圍。應該說明的是, 列舉型別是一種基本資料型別,而不是一種構造型別, 因為它不能再分解為任何基本型別。

列舉型別的定義和列舉變數的說明

一、列舉的定義

列舉型別定義的一般形式為:

enum 列舉名 ;

在列舉值表中應羅列出所有可用值。這些值也稱為列舉元素。

例如:enum weekday ;

該列舉名為weekday,列舉值共有7個,即一周中的七天。 凡被說明為weekday型別變數的取值只能是七天中的某一天。

二、列舉變數的說明

如同結構和聯合一樣,列舉變數也可用不同的方式說明, 即先定義後說明,同時定義說明或直接說明。設有變數a,b,c被說明為上述的weekday,可採用下述任一種方式:

enum weekday ;

enum weekday a,b,c;或者為: enum weekday

a,b,c;或者為: enum

a,b,c;

列舉型別變數的賦值和使用

列舉型別在使用中有以下規定:

1. 列舉值是常量,不是變數。不能在程式中用賦值語句再對它賦值。例如對列舉weekday的元素再作以下賦值: sun=5;mon=2;sun=mon; 都是錯誤的。

2. 列舉元素本身由系統定義了乙個表示序號的數值,從0 開始順序定義為0,1,2…。如在weekday中,sun值為0,mon值為1, …,sat值為6。

main() a,b,c;

a=sun;

b=mon;

c=tue;

printf("%d,%d,%d",a,b,c); }

3. 只能把列舉值賦予列舉變數,不能把元素的數值直接賦予列舉變數。如: a=sum;b=mon; 是正確的。而: a=0;b=1; 是錯誤的。如一定要把數值賦予列舉變數,則必須用強制型別轉換,如: a=(enum weekday)2;其意義是將順序號為2的列舉元素賦予列舉變數a,相當於: a=tue; 還應該說明的是列舉元素不是字元常量也不是字串常量, 使用時不要加單、雙引號。

main() month[31],j;

int i;

j=a;

for(i=1;i<=30;i++)

for(i=1;i<=30;i++) }

printf("\n"); }

位運算前面介紹的各種運算都是以位元組作為最基本位進行的。 但在很多系統程式中常要求在位(bit)一級進行運算或處理。c語言提供了位運算的功能, 這使得c語言也能像組合語言一樣用來編寫系統程式。

一、位運算子c語言提供了六種位運算子:

& 按位與

| 按位或

^ 按位異或

~ 取反

<< 左移

>> 右移

1. 按位與運算 按位與運算子"&"是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。

例如:9&5可寫算式如下: 00001001 (9的二進位制補碼)&00000101 (5的二進位制補碼) 00000001 (1的二進位制補碼)可見9&5=1。

按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進位制數為0000000011111111)。

main()

2. 按位或運算 按位或運算子「|」是雙目運算子。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有乙個為1時,結果位就為1。參與運算的兩個數均以補碼出現。

例如:9|5可寫算式如下:

00001001|00000101

00001101 (十進位制為13)可見9|5=13

main()

3. 按位異或運算 按位異或運算子「^」是雙目運算子。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:

00001001^00000101 00001100 (十進位制為12)

main()

4. 求反運算 求反運算子~為單目運算子,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110

5. 左移運算 左移運算子「<<」是雙目運算子。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,

高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進位制3),左移4位後為00110000(十進位制48)。6. 右移運算 右移運算子「>>」是雙目運算子。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。

例如:設 a=15,a>>2 表示把000001111右移為00000011(十進位制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。turbo c和很多系統規定為補1。

main()

請再看一例!

main()

c 列舉與位列舉

環境 c 中的列舉本質上說是乙個整數,但它同時和字串又具有對應關係,可以從vs的提示中看出 下面 演示列舉與數字和字串的相互轉換 public static void main string args 數字轉列舉 console.writeline 數字轉列舉 列舉轉字串 console.write...

c語言位運算

c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1...

C語言位運算

c語言位運算 位運算應用口訣 清零取反要用與,某位置一可用或 若要取反和交換,輕輕鬆鬆用異或 移位運算 1 它們都是雙目運算子,兩個運算分量都是整形,結果也是整形。2 am p 3 amp amp amp qu ot 右 移 右邊 的位被擠 掉。對於 左邊移出 的空位,如果是正 數則空位 補0,若 ...