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