日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

bool类型未初始化的产生的奇怪现象

發(fā)布時(shí)間:2025/5/22 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bool类型未初始化的产生的奇怪现象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?在寫C++代碼時(shí),有時(shí)候可能會(huì)忘記對(duì)一個(gè)布爾變量賦初值,運(yùn)行程序后會(huì)發(fā)現(xiàn)產(chǎn)生了一些自己預(yù)想不到的結(jié)果,或者程序并沒有按照設(shè)定的分支運(yùn)行,今天來說一下這背后的原理性的東西。首先來看一段簡(jiǎn)單代碼:

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模式下運(yùn)行這段代碼,會(huì)發(fā)現(xiàn)輸出結(jié)果為3;而在Release模式下會(huì)發(fā)現(xiàn)有的編譯器可能輸出2,也有可能輸出3,而有的編譯器可能輸出1,也可能輸出2。這到底為什么呢?難道布爾類型除了true和false之外還有第三種值?為什么Debug模式和Release模式輸出會(huì)不一樣呢?帶著這些疑問來進(jìn)行進(jìn)一步深入探索。

首先 有一點(diǎn)需要了解,就是在Debug模式下VC 會(huì)把未初始化的棧內(nèi)存全部填成 0xcccccccc ,當(dāng)字符串看就是 “燙燙燙燙……”;會(huì)把未初始化的堆內(nèi)存上全部填成 0xcdcdcdcd,當(dāng)字符串看就是 “屯屯屯屯……”。知道了這一點(diǎn),先來看Debug模式下的三個(gè)實(shí)驗(yàn):

(1)bTest初始化為true;

(2)bTest初始化為false;

(3)bTest未初始化;

根據(jù)上述三個(gè)實(shí)驗(yàn)可以知道,當(dāng)bool變量初始化為true時(shí),寫入內(nèi)存的是1,當(dāng)初始化為false是,寫入的是0,當(dāng)未初始化時(shí),寫入的是0xcc(十進(jìn)制是204)。?我們對(duì)bool變量賦予不同的初值,反映到內(nèi)存中就是寫入了不同的數(shù)值,而true和false只能寫入1和0,那如果我們對(duì)bool變量不是賦值為true和false,而是用一個(gè)數(shù)對(duì)它賦值,寫入內(nèi)存的又會(huì)是什么呢,比如讓bTest=12.45,可以看到如下情形:

由實(shí)驗(yàn)可知,只要賦值為非零的數(shù)值,寫入內(nèi)存的都是1,賦值為零,寫入內(nèi)存的才是0,而對(duì)于bool類型變量來說,當(dāng)你使用這個(gè)變量的時(shí)候,從內(nèi)存讀取到1,則說明是true,讀取到0,則說明是false,而所有非零數(shù)據(jù)寫入內(nèi)存后都變成1,這樣導(dǎo)致讀回來其實(shí)都是true,這就是大家常說的非零為true,0為false的本質(zhì)。由此我們可以解釋開篇中程序在Debug模式下為什么會(huì)輸出3呢?因?yàn)槲磳?duì)變量初始化,寫入內(nèi)存的是0xcc?,而后面進(jìn)行比較的時(shí)候,讀回來發(fā)現(xiàn)數(shù)值既不是0也不是1而是0xcc,所以既不會(huì)等于true,也不會(huì)等于false,從而進(jìn)入程序的else分支。

在Release模式下,并沒有會(huì)把未初始化的棧內(nèi)存上全部填成 0xcc的優(yōu)化,所以當(dāng)在Release模式下,如果未對(duì)bool類型變量進(jìn)行初始化的話,那么變量的值取決于內(nèi)存中的原先存儲(chǔ)的值,所以輸出情況比較隨機(jī),既有可能為true,也有可能為false,還可能是一個(gè)非true和false的值,而且不同編譯器對(duì)其優(yōu)化不一樣,導(dǎo)致可能進(jìn)入的程序分支不同,但基本都是隨機(jī)的。由此你就可以解釋開篇程序在Release模式既有可能輸出1又有可能輸出2的隨機(jī)現(xiàn)象呢。

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的bool类型未初始化的产生的奇怪现象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。