c語言中變數初始化與賦初值有什麼不同

時間 2021-10-17 04:47:57

1樓:匿名使用者

語法上的初始化是指物件定義時,對應的分配空間之後對於值的操作。c語言中,靜態和全域性變數預設置0,有初始化列表的複製初始化列表的值到空間(如有不足,剩餘部分置0),區域性自動變數可以不初始化(偵錯程式參與時可能被隱式地初始化為其它的值("debug magic number"),例如預設情況下microsoft c/c++ debugger會把棧中未初始化的位元組置為0xcc)。

賦初值一般而言是指邏輯意義上的初始化。在c語言中,由於初始化的語法是「=」後加初值,所以「賦初值」基本上就是指語法上的初始化。不過隨著語言的發展,「賦初值」的意義發生了擴大。

對有構造語義但又允許不初始化而不產生編譯錯誤的程式設計語言而言,兩者有些微妙的差別。例如c++的建構函式中,用若干個成員名和括號括起來的初始化值構成的初始化列表是語法上的初始化(也可能是邏輯意義上的初始化,如果沒有被建構函式體內的值覆蓋),而建構函式體中對成員的賦值語句是邏輯上的初始化但不是語法上的初始化。

冰的悸動 錯誤:

1.「程式開始時進行初始化」的說法僅僅適用於靜態或全域性變數,而不適於區域性自動變數。區域性自動變數在函式呼叫時才能被初始化。

2.「但是根據編譯器的不同有些編譯器會自動賦初值0或其他」——這在iso/iec c語言標準中不是由實現定義的行為,如果一個編譯器符合標準,那麼行為就是明確的,即視此初始化的物件是否為全域性物件來判斷隱式初始化置0還是不進行初始化——從下面的函式定義來看這裡應該var2是全域性變數,會被置0。非標準編譯器則另當別論(但是我還沒見過會在這點上沒事找茬的)。

2樓:冰的悸動

所謂初始化,就是指系統(程式)起始狀態時,各種引數(變數)應該取什麼樣的值,因為系統在reset時,記憶體資料可能不定,所以需要在程式開始時進行初始化(變數賦值,控制暫存器賦值配置等)。

賦初值一般指定義一個變數的同時就賦值。

其實,「變數初始化」和「賦初值」只是2種說法,目的都差不多,不必太「糾結」這兩個詞。

下面是一個mainloop的結構,當然也可以不用loop,具體根據你的程式用處決定

/*一般需要初始化的變數都是全域性變數 定義變數var2 */

uint16 var2; /*此處var2,僅僅分配了記憶體空間2位元組,但是沒有賦初值,所以var2的具體值是多少不清楚,但是根據編譯器的不同有些編譯器會自動賦初值0或其他*/

void sysinit(void)

main()

} 剛剛看了「幻の上帝」的回答,似乎也沒能說清「初始化」和「賦初值」的區別,只是用「微妙」形容了一下。

關於指出的2點錯誤,再此首先表示感謝,下面是我的答覆:

1.指出「區域性auto變數」在我上述論述中,首先並沒有提到。再者,「區域性auto變數」本身的特性就是在函式呼叫時才臨時分配(一般分配在堆疊中),函式退出時釋放。

所以,區域性auto變數要在函式呼叫時才能被初始化,這個說法有點「說了也白說」的感覺。而且我也並沒有提到適用於「區域性auto變數」。既然說到這裡了,順便提一下慎用「static區域性變數」,首先就是長期佔用(函式退出時也佔用,不釋放);其次,降低程式的可讀性(多次呼叫這個函式時,如果開始不對其賦初始值[有點廢話的感覺],那麼就往往弄不清static區域性變數的值)。

2.既然我也提到了和編譯器有關,我也沒有說一定是0或不是0,只是要根據編譯器,目的是為了解釋為什麼要進行「初始化」的初衷,如果為了討論各種編譯器的標準的話,那我再此先謝謝你提供的訊息,但是我覺得沒有必要去糾結這些標準,我們只要養成良好的程式設計習慣,記得定義完變數後,進行「賦初值」或「初始化」,就ok了,這樣就不會去爭論編譯器自動賦什麼初值。再者c編譯器也好c的標準也好,都也在不斷的更新。

所以我認為我上面的說法也並沒有什麼錯誤。

3樓:匿名使用者

c語言中應該沒有區別吧,在物件導向的程式設計語言中往往會有區別。

c語言問題——未初始化int變數的初值

4樓:

c語言問題未初始化int變數的初值是設定錯誤造成的,解決方法為:

1、首先我們開啟我們的編譯器,在main函式中寫。

2、然後我們宣告定義變數的型別,比如int(整形)double(雙精度)float(浮點型)char(字元型),已 int整形為例。

3、之後要有個空格。

4、接下來寫我們的變數名,注意區分大小寫,大小寫在c語言中是不一樣的。

5、如果想宣告一個型別的多個變數中間要加上逗號。

6、以宣告a,b兩個變數為例,注意在結束時不要忘記了分號。

5樓:風若遠去何人留

int變數未初始化的預設初值,和變數的型別有關。

1 區域性變數,在未初始化情況下,初值為隨機值。c規範對該初值並沒有做規定,具體實現由編譯器決定。如vc/vs等編譯器,會將初始值值為0xcccccccc, 而gcc等編譯器則是不可預知的隨機值。

2 靜態區域性變數,即帶static修飾的區域性變數。

全域性變數和靜態全域性變數,即定義在函式外,不屬於任何一個函式的變數。

這幾種預設初值為0.

6樓:匿名使用者

沒有初始化,記憶體上的值是任意的,但只要你宣告瞭變數,變數的地址就是固定的了,因此裡面的值,無論你重啟編譯器多少次,結果都是一樣的。如果你在下面再定義一個int型別的變數,再列印看看,它的值也許就跟你上面的值不同

不初始化就參與運算是很危險的,有的編譯器是不允許這樣操作的,因此變數最好要初始化

7樓:匿名使用者

在debug配置中,vc++自動把未初始化的空間填充了0xcc,int型的就是0xcccccccc,按有符號整數列印,就是-858993460了

8樓:匿名使用者

全域性是0

區域性的int預設的是-858993460,即0xcccccccc。

9樓:

你有沒有初始化?沒有的話 系統預設分配最大值

10樓:

你重啟電腦,說不定就不一樣了

c語言變數初始化的方式,C語言中變數的初始化怎麼理解?

全域性變數的初始化 對於不同編譯單位的全域性變數,其初始化的順序沒有任何的保證,因此對不同編譯單位裡的全域性變數,在它們的初始化順序之間建立依賴性都是不明智的。此外也沒辦法捕捉到全域性變數初始化丟擲的異常,一般來說要減少全域性變數的使用,特別是限制那些要求複雜初始化的全域性變數。1,儘量不用全域性變...

c語言中定義變數不賦初值預設是多少

enjoy蘰踄繧鍴 沒有加static,預設為auto 型,此時,不給初值,變數的初值是隨機的。如果加了static不給初值,變數的初值是預設的 0。其實不能說不賦初值就不行,對於區域性變數,不賦初值的話,其實他裡面存的是一個隨機的值,誰也不知道他是多少,因此如果沒賦初值的情況下就使用它,程式是完全...

在C語言中,為什麼定義變數的時候總是初始化為0呢?該怎麼理解

符潔愚媚 因為變數是可以變動的,定義一個變數不初始化時,變數會是一個隨機數,進行計算了的時候,就會引用那個隨機數進行計算,會有誤差。 如果全域性變數在定義時不初始化則初始值是0,如果區域性變數在定義時不初始化則初始值是不確定的。 沒字天書 誰說總是初始化0的,全域性變數和靜態變數會,區域性變數不一定...