我只負責轉換![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 ...