我只負責轉換! C C

2021-08-21 23:27:35 字數 1824 閱讀 3429

我只負責轉換![c/c++]

written by allen lee

前不久,lsp在這裡留下這樣乙個問題:

說明:1.定義了乙個列舉如下:

_jb_prog_mode

;enum

_jb_prog_modee_prog_index;

2.疑惑:

e_prog_index=(

enum

_jb_prog_mode)-1

; e_prog_index等於-1?為什麼?

你的疑惑隱藏著這樣乙個結論:e_prog_index的值不應該等於-1。我相信你得出這個結論的理由是_jb_prog_mode列舉中沒有哪個成員的值為-1,於是型別為_jb_prog_mode的變數e_prog_index的值也不應該為-1。

現在,我們轉換一下場景,假定登錄檔中有如下的資訊:

[hkey_local_machine\software\allen]

"name"="allen lee"

"id"=dword:00000584

我們如何通過程式設計獲取這些資訊呢?我們可以使用win32 api的regqueryvalueex()函式來讀取這些資訊(**片斷):

lpbytelpdata;

dworddatabuflen;

if(regqueryvalueex(hkey,

//hkey為指向hkey_local_machine\software\allen的控制代碼

"name",

null,

null,

lpdata,

&databuflen)

==error_success)

if(regqueryvalueex(hkey,

"id",

null,

null,

lpdata,

&databuflen)

==error_success)

留意這段**有兩次轉換,如果我們分別把convert_01和convert_03替換為convert_02和convert_04的話會怎麼樣呢?編譯器不會為難你的,但執行效果可想而知。

回顧這兩個例子,我們可以得到什麼結論呢?正如本文的題目——

我只負責轉換!

當你強制把-1轉換為_jb_prog_mode型別並賦值予e_prog_index變數時,你只能說e_prog_index變數不包含_jb_prog_mode列舉預定義的值,並不能說e_prog_index變數的值非法(其實列舉型別和整數型別之間有著很深的淵源)。編譯器是不會妨礙你的這種轉換,而這種轉換是否有意義就是另外一回事了。當然,你應該採取某些措施來檢測列舉變數是否包含預定義的值,否則你將可能不時收到意外驚喜。

在c/c++中,列舉其實是整數常量的一種表現形式,它實質上只是協助程式設計師標識一組相關的整數常量。語義上,

_jb_prog_mode

; 等效於

static

const

intprogram_one=0;

static

const

intprogram_two=1;

c/c++給予程式設計師最大的自由來進行選擇,這也體現出c/c++對程式設計師的信任。然而,這種信任究竟是幫助我們還是傷害我們,就要看程式設計師本身的做法了。

最後,我引用robert b. murray的一段話[1]結束本文:

寫出依賴於語言中定義含糊、意義微妙的規則的程式是不好的,即便作者本人清楚它的意義並保證它可以正確執行,下乙個來維護這段**的人也可能未必能夠做到這點。比較好的做法是:堅持使用語言中那些被廣泛使用及理解的部分來寫程式。

see also:

我和爸爸負責包粽子

在我眼中的吃飯 今天的在我眼中的吃飯,在我眼中,我呢,粽葉,我和爸爸負責包粽子,多彩的初中生活,當啟明星偷偷公升起的時候,競爭與超越與其嫉妒別人,就開始包了,消災我又出現了新的吃飯煩惱做事不細心。向著知識的殿堂奔去,是我們嚮往自由,吃完早餐,就是包的太小,爸爸一買回家,包的粽子像模像樣,多彩的吃飯初...

你只負責好好做人,上天自有安排

乙個旅行者,在一條大河旁看到了乙個婆婆,正在為渡水而發愁。已經精疲力竭的他,用盡渾身的氣力,幫婆婆渡過了河,結果,過河之後,婆婆什麼也沒說,就匆匆走了。旅行者很懊悔。他覺得,似乎很不值得耗盡氣力去幫助婆婆,因為他連 謝謝 兩個字都沒有得到。哪知道,幾小時後,就在他累得寸步難行的時候,乙個年輕人追上了...

c c 進製轉換

c include include using namespace std int main for int n 0 n 20 n cout 這種寫法只能將十進位制數轉換為十進位制的 八進位制 十六進製制的。c 無符號性的要新增符號 include int main int a,b,c scanf ...