2010-04-11 74 views
3

如果我有一個全局靜態變量x就像這個代碼C固定變量和初始化

#include <stdio.h> 
#include <stdio.h> 

static int x; 

int main(void) 
{ 

DO SOMETHING WITH x HERE 

x++; 

} 

會有什麼區別,如果我選擇來初始化X的值先說在

static int x = 0; 
進入「主」之前有

嗎?

在我沒有給x賦值的第一種情況下,編譯器是否隱式知道x將被設置爲零,因爲它是一個靜態變量?我聽說我們可以用靜態變量來做到這一點。

非常感謝......

回答

3

有一個很好的答案here

只是一個短期的摘錄:

都在ISO C(ANSI C)首先,在程序開始前所有的靜態和全局變量必須初始化。如果程序員沒有明確地這樣做,那麼編譯器必須將它們設置爲零。如果編譯器不這樣做,它不會遵循ISO C.準確地說,如何初始化變量但是標準未指定。

+0

感謝您的鏈接。從那裏我讀到「這些問題的唯一解決方案是編寫代碼,以便在運行時完成靜態/全局初始化,就在使用變量之前」。回到我的案例,那麼我可以在x被使用之前在我的「main」中包含「static int x」這一行嗎?這是更好的編程習慣嗎? – yCalleecharan 2010-04-11 13:56:23

+0

@yCalleecharan:如果x只被main使用,那麼你應該在main中聲明它。如果你聲明它是自動的,它將始終在堆棧中。如果你聲明它是靜態的,它不會浪費任何堆棧空間。 – tomlogic 2010-04-11 16:53:32

+0

這是非常有趣的知道。我很想知道C中哪些書討論了這些問題。謝謝。 – yCalleecharan 2010-04-11 19:48:35

7

具有明確初始化靜態變量總是初始化爲零(或空指針,根據不同的類型)。 C標準§ 6.7.8/10對此有描述。但明確地將它設置爲0可以幫助其他人不必懷疑同一個問題:)。

+0

非常感謝您的確認。 – yCalleecharan 2010-04-11 13:48:20

+0

如果它們是浮點數,則爲0.0或0.0;如果它們是指針,則爲NULL。 (它們在內存中都具有相同的基本值。) – 2010-04-11 13:48:31

+0

您可能會考慮注意到C99標準指定了這一點,但找到此答案的人可能仍然需要解決舊編譯器的問題。 – 2010-04-11 15:59:01

0

靜態變量始終隱式初始化爲零,因此在將x明確初始化爲零時不會有任何區別。

+0

謝謝。是的我明白。 – yCalleecharan 2010-04-11 13:50:28

3

static變量會自動初始化爲0(即如果您已將0賦值給它們,即使這些值的內部表示不全部爲零,也會使浮點數和指針分別變爲0.0和NULL)。

+0

謝謝。 「即使這些值的內部表示不是全部爲零」,你的意思是什麼?你能澄清一下嗎? – yCalleecharan 2010-04-11 13:50:12

+0

@yCallee:如果某個體系結構的NULL值爲0x1000,則該指針將被初始化爲0x1000而不是0。 – kennytm 2010-04-11 13:53:11

+0

@yCalleecharan:C *編譯器*會將一個整數常量賦值爲零,並將其作爲指針創建空指針,但該機器的實際空指針值可能不爲零。所以指針實際上可能不會被初始化爲給定機器上的內存中的所有位0,而是如同寫入了'= 0'一樣。 – Arkku 2010-04-11 13:55:56