2012-03-18 33 views
3

我一般看到初始化的例子VS分配是這樣的:正在初始化一個垃圾變量真正初始化或只是一個任務?

int funct1(void) 
{int a = 5; /*initialization*/ 
a = 6;}  /*assignment*/ 

顯然有些剩餘垃圾或未定義不知何故未初始化。

但是,有人可以定義初始化是否爲定義語句保留和/或賦值是否可以稱爲初始化?

int funct2(void) 
{int b;  
b = 5;}  /*assignment, initialization or both??*/ 

也有很大的技術原因,我們不能說INT B爲(從視編譯點)初始化爲垃圾?

此外,如果可能的話,這可以與初始化和分析非基元數據類型進行比較。

+3

垃圾變量? – 2012-03-18 11:47:02

+0

int b;只包含垃圾,就是我的意思。 – sabgenton 2012-03-18 12:17:28

回答

4

就語言標準而言,只有形式爲int a = 5;的陳述是初始化。一切形式b = 5;是一項任務。

非原始類型也是如此。

+1

是的,這是有道理的聲明我聽到像「你可以分配給一個const變量,而你可以 初始化它。」 – sabgenton 2012-03-18 11:52:13

+0

你可以改變int b = 5爲int a = 5,以便它符合我的問題(除非它減損你的說法)? – sabgenton 2012-03-18 12:00:12

+0

@sabgenton:當然, – 2012-03-18 12:00:46

0

而且「爲什麼我們不能說int b被初始化爲垃圾」這個技術原因有很多,如果你沒有將任何值放入內存位置,那就不是「初始化」。從編譯器的角度來看,沒有機器語言指令生成寫入該位置,所以沒有任何反應。

+0

我仍然可以在b中顯示隨機垃圾值,編譯器會在處理b時做什麼或警告我什麼? (因爲它知道沒有機器語言指令已被寫入到您指定的位置) – sabgenton 2012-03-18 12:30:36

+0

不,沒有警告。如果你想做壞事,完全取決於你。 C++不會牽着你的手,就像我可以命名的其他一些語言一樣。 – 2012-03-18 13:41:41

+2

@sabgenton至少如果您將警告級別提高,一個好的編譯器會警告您使用未初始化的變量。 – 2012-03-18 14:20:26

5

我會復活此主題以添加重要觀點,因爲OP對術語的困惑是可以理解的。正如@OliCharlesworth所指出的(並且他完全正確),就C語言標準而言,初始化和賦值是兩個完全不同的東西。例如(假設本地範圍內):

int n = 1; // definition, declaration and **initialization** 
int k;  // just definition + declaration, but no initialization 
n = 12;  // assignment of a previously initialized variable 
k = 42;  // assignment of a previously UNinitialized variable 

的問題是,教編程的很多書都沒有那麼挑剔術語,所以他們稱之爲「初始化」任何給一個變量的第一個有意義的價值「手術」 。因此,在上面的示例中,n = 12不會是初始化,而k = 42會。當然,這個術語是模糊的,不精確的,可能會引起誤解(儘管它經常被使用,特別是老師在向新手介紹程序​​時)。作爲這種不確定性的一個簡單的例子,讓我們改寫前面的例子中考慮全球範圍內考慮:

// global scope 
int n = 1; // definition, declaration and **initialization** 
int k;  // definition, declaration and **implicit initialization to 0** 

int main(void) 
{ 
    n = 12;  // assignment of a previously initialized variable 
    k = 42;  // assignment of a previously initialized variable 

    // ... other code ... 
} 

你會說什麼在main的任務?第一個顯然只是一個任務,但是根據模糊的通用術語,它是第二次初始化嗎?默認值0是否給k第一個「有意義」的值?

此外,一個變量是通常說如果沒有初始化或分配已被應用到它未初始化。鑑於:

int x; 
x = 42; 

一會常用x被轉讓之前未初始化,而不是之後。術語賦值初始化程序在語法上被定義,但是像「初始化」和「未初始化」的術語經常被用來指代語義(在某種非正式用法中)。 [感謝基思湯普森最後一段]。

我不喜歡這個模糊的術語,但應該意識到它被使用了,唉,不是很少見。

+1

而且一個變量通常被認爲是*未初始化的*如果沒有初始化*或賦值被應用到它。鑑於:'int x; x = 42;''''''''通常會說'x'在賦值之前是*未初始化的,但在它之後沒有初始化。術語*賦值*和*初始值賦值*在語法上被定義,但是像「初始化」和「未初始化」這樣的術語經常被用來指代語義(在某種非正式的用法中)。 – 2013-09-12 19:51:08

+0

@KeithThompson感謝您的有益補充!它真的完成了我想傳達的圖片! – 2013-09-12 19:54:19

+0

隨意將其納入您的答案。 – 2013-09-12 20:06:12