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