C語言學習趣事_這樣的IF子句Condition你傷的起嗎?

weixin_34344677發表於2012-12-30

  前兩天我在一個QQ群裡面,看到一個群友發了一段“奇特的”C++程式碼,應該算是C++吧,我也說不準了。下面我們看看整個的討論過程。

 

  上面是我大體擷取的部分對話過程,應該是連貫的,這裡我就迷惑了,給他們一弄我動搖了,動搖的不是我對這個推理過程的認識,而是我無語的動搖了。

  這裡我對VTC_King同學的這種探索精神表示讚賞,俗話說:盡信書不如五書。

  下面是我對這個程式的執行過程:

  從上面的過程來看,程式如我所說,成功的編譯,而且我開啟的是-Wall編譯選項;而且程式編譯後成功執行,但是輸出的結果

也和我預想的一樣,沒有輸出:Yes.

  那麼我們如何看這個過程呢?

  為了弄明白這個過程,我可是廢了很大的神,下面就慢慢的來扯一下:

 

【C/C++中bool型變數的儲存空間】

  1、百度空間的說法

  連結地址:http://hi.baidu.com/maxy218/item/b8dce172fa37d11cd1dcb3cf

  2、百度百科的說法

  連結地址:http://baike.baidu.com/view/1557195.htm

  3、CSDN  rushkid02的專欄  blog的說法

  4、維基百科的說法

  5、我自己在Linux FC4中跑出來的結果:

  這裡我們基本可以確認在C++的編譯過程中,bool型別的變數儲存空間為1個位元組(但是具體還要看編譯的實現,不過目前來看,應該都是這樣處理的)。

 

【關於 (char &)b=2; 這個賦值語句】

  我們知道賦值的過程說起來很容易,但是這個地方卻被VTC_King同學搞的有點複雜了,首先來看這個賦值語句的右值部分:2;為一個int整型字面值。

而左值部分:(char &)b 

     b為bool型變數,從前面的論述來看,這個變數的儲存空間是一個位元組;剛好滿足char字元的儲存空間;而賦值的實際過程是將一個值儲存到變數所代表的

記憶體空間,因此我們可以看到 (char &)b=2; 這個語句將整型字面值儲存到了b所代表的那個大小為1個位元組記憶體空間,同時這個賦值語句在將內容儲存到

記憶體空間之間進行了型別轉換,這樣2就很安全的住到了他的 “新家”; 即 b 代表的那個位元組現在儲存的內容是(char)2 這個字元。

  這與我們通常認為的bool型別賦值隱式轉換出現了偏差;我們來看一段摘自C++之父寫的書的一段話:

  雖然是翻譯成漢語了,但是意思我看了原本的,應該來說就是這樣的。

  【要點】 這裡引用這段話,後面的論述還需要用到。

   最後:

    這裡我們確定了,經過  (char &)b=2; 這個賦值語句後,b中儲存的內容是 (char)2

  下面是驗證的結果:

  可以看到輸出的結果是: blank 字元

  查表知道:

     (char)2 就是:STX 為非列印字元

    我們還可以通過該變一下來驗證:

 

【關於 == 和 &&】

  在QQ中討論的時候,我就說過 “==” 是關係運算子,而 bool 量是用於邏輯運算的;結果被VTC_King同學鄙視了;哎,真是騷年無謂啊。我也

不說別的,就摘引一段C Programing Language 中的一段話吧:

  下面是英文原版:

  這個話題就不多說了吧,相信明眼人都知道怎麼回事。

 

【關於 if(b==true) 這個計算過程】

  這裡我真不想說了,  至於true在計算的過程中,怎麼轉換,請看我引用的C++之父的書的中文翻譯版,而b的值我想更不需要說了吧,前面已經論述過了。

 

【結語】

     那麼到了這裡這個“奇特而詭異的”程式的執行過程怎麼樣呢?

    你還有疑問嗎?

 

按:

  我真佩服現在這些學生的創造力啊, 算了還是不說了。 

      最後還想說一句: 現在很多童鞋,一遇到事就拿彙編來說事,哎,真的沒辦法了,我只能說一句C是C,彙編是彙編。要知道這個世界有很多的彙編,但是C標準

就一個(我的意思是所有的人都遵循一個標準,你要說C有ANSI C、C89、C90、還有什麼C99,我也沒辦法)。

 

  這裡歡迎各位大神來討論, 有不對的地方敬請拍磚。

 

相關文章