C語(yǔ)言的賦值和初始化?
語(yǔ)法上的初始化是指對(duì)象定義時(shí),對(duì)應(yīng)的分配空間之后對(duì)于值的操作。C語(yǔ)言中,靜態(tài)和全局變量默認(rèn)置0,有初始化列表的復(fù)制初始化列表的值到空間(如有不足,剩余部分置0),局部自動(dòng)變量可以不初始化(調(diào)試器參與時(shí)可能被隱式地初始化為其它的值("debugmagicnumber"),例如默認(rèn)情況下microsoftc/c++debugger會(huì)把棧中未初始化的字節(jié)置為0xcc)。
賦初值一般而言是指邏輯意義上的初始化。在c語(yǔ)言中,由于初始化的語(yǔ)法是“=”后加初值,所以“賦初值”基本上就是指語(yǔ)法上的初始化。不過隨著語(yǔ)言的發(fā)展,“賦初值”的意義發(fā)生了擴(kuò)大。對(duì)有構(gòu)造語(yǔ)義但又允許不初始化而不產(chǎn)生編譯錯(cuò)誤的程序設(shè)計(jì)語(yǔ)言而言,兩者有些微妙的差別。例如c++的構(gòu)造函數(shù)中,用若干個(gè)成員名和括號(hào)括起來的初始化值構(gòu)成的初始化列表是語(yǔ)法上的初始化(也可能是邏輯意義上的初始化,如果沒有被構(gòu)造函數(shù)體內(nèi)的值覆蓋),而構(gòu)造函數(shù)體中對(duì)成員的賦值語(yǔ)句是邏輯上的初始化但不是語(yǔ)法上的初始化。
冰的悸動(dòng)錯(cuò)誤:
1.“程序開始時(shí)進(jìn)行初始化”的說法僅僅適用于靜態(tài)或全局變量,而不適于局部自動(dòng)變量。局部自動(dòng)變量在函數(shù)調(diào)用時(shí)才能被初始化。
2.“但是根據(jù)編譯器的不同有些編譯器會(huì)自動(dòng)賦初值0或其他”——這在iso/iecc語(yǔ)言標(biāo)準(zhǔn)中不是由實(shí)現(xiàn)定義的行為,如果一個(gè)編譯器符合標(biāo)準(zhǔn),那么行為就是明確的,即視此初始化的對(duì)象是否為全局對(duì)象來判斷隱式初始化置0還是不進(jìn)行初始化——從下面的函數(shù)定義來看這里應(yīng)該var2是全局變量,會(huì)被置0。非標(biāo)準(zhǔn)編譯器則另當(dāng)別論(但是我還沒見過會(huì)在這點(diǎn)上沒事找茬的)。