bool类型未初始化的产生的奇怪现象
?在寫C++代碼時,有時候可能會忘記對一個布爾變量賦初值,運行程序后會發現產生了一些自己預想不到的結果,或者程序并沒有按照設定的分支運行,今天來說一下這背后的原理性的東西。首先來看一段簡單代碼:
int main() {bool bTest;if (true==bTest){cout << "1" << endl;}else if(false==bTest){cout << "2" << endl;}else{cout << "3" << endl;}system("pause");return 0; }在VS中的Debug模式下運行這段代碼,會發現輸出結果為3;而在Release模式下會發現有的編譯器可能輸出2,也有可能輸出3,而有的編譯器可能輸出1,也可能輸出2。這到底為什么呢?難道布爾類型除了true和false之外還有第三種值?為什么Debug模式和Release模式輸出會不一樣呢?帶著這些疑問來進行進一步深入探索。
首先 有一點需要了解,就是在Debug模式下VC 會把未初始化的棧內存全部填成 0xcccccccc ,當字符串看就是 “燙燙燙燙……”;會把未初始化的堆內存上全部填成 0xcdcdcdcd,當字符串看就是 “屯屯屯屯……”。知道了這一點,先來看Debug模式下的三個實驗:
(1)bTest初始化為true;
(2)bTest初始化為false;
(3)bTest未初始化;
根據上述三個實驗可以知道,當bool變量初始化為true時,寫入內存的是1,當初始化為false是,寫入的是0,當未初始化時,寫入的是0xcc(十進制是204)。?我們對bool變量賦予不同的初值,反映到內存中就是寫入了不同的數值,而true和false只能寫入1和0,那如果我們對bool變量不是賦值為true和false,而是用一個數對它賦值,寫入內存的又會是什么呢,比如讓bTest=12.45,可以看到如下情形:
由實驗可知,只要賦值為非零的數值,寫入內存的都是1,賦值為零,寫入內存的才是0,而對于bool類型變量來說,當你使用這個變量的時候,從內存讀取到1,則說明是true,讀取到0,則說明是false,而所有非零數據寫入內存后都變成1,這樣導致讀回來其實都是true,這就是大家常說的非零為true,0為false的本質。由此我們可以解釋開篇中程序在Debug模式下為什么會輸出3呢?因為未對變量初始化,寫入內存的是0xcc?,而后面進行比較的時候,讀回來發現數值既不是0也不是1而是0xcc,所以既不會等于true,也不會等于false,從而進入程序的else分支。
在Release模式下,并沒有會把未初始化的棧內存上全部填成 0xcc的優化,所以當在Release模式下,如果未對bool類型變量進行初始化的話,那么變量的值取決于內存中的原先存儲的值,所以輸出情況比較隨機,既有可能為true,也有可能為false,還可能是一個非true和false的值,而且不同編譯器對其優化不一樣,導致可能進入的程序分支不同,但基本都是隨機的。由此你就可以解釋開篇程序在Release模式既有可能輸出1又有可能輸出2的隨機現象呢。
?
?
?
?
總結
以上是生活随笔為你收集整理的bool类型未初始化的产生的奇怪现象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的电脑上的应用需要使用以下window
- 下一篇: PHP知识点 自己做个记录