2017-09-01 69 views
1
void f(void); 
int x = 15213; 
int main() 
{ 
    f(); 
    printf("x = %d\n", x); 
    return 0; 
} 

/* bar3.c */ 
int x; 
void f() 
{ 
    x = 15212; 
} 

在上面的代碼中,我得到的輸出是15212.我不明白怎麼做?使用全局變量解釋C程序的輸出

首先,主函數調用f()在另一個c文件中定義。在f()中,x的值從15213更改爲15212.然後我們打印x。但是對x做出的改變應該只保留在f中嗎? X的範圍應該僅限於f()。即使那麼它正在打印15212

+4

'x'是一個全局變量。爲什麼它的範圍限於'f'? – jwodder

+0

要獲得您似乎想要的行爲,請在兩個文件中使用'static int x'。 –

+1

'x'在任何函數之外聲明,所以它是一個全局變量。如果你不想將'x'的作用域限制爲'f()',那麼你必須在'f()'中聲明它(也可以把它設爲'static')。如果你希望它的作用域被限制爲一個源文件(比如'bar3.c'),那麼一定要使它成爲'static'。 –

回答

1

因爲x定義在任何函數的範圍之外,所以它具有全局範圍。所以f()分配其值的運行實際上改變了它的值,如圖所示。

main()運行時,它所做的第一件事就是調用f(),它會更改該值(有些人可能會認爲是副作用)。這就是爲什麼從未使用15213的初始值。

5

您已定義變量x外部在2個翻譯單元中的關聯。程序的行爲因此是undefinedC11 6.9p5

  • 外部定義是一個外部聲明,這也是一個功能(比內聯定義其他)或對象的定義。如果在表達式中使用通過外部鏈接聲明的標識符(除了作爲sizeof或_Alignof運算符(其結果爲整數常量)的操作數的一部分),則在整個程序中的某處應完全是一個外部定義標識符;否則,不得超過一個。
  • 有一個共同的擴展名(C11 J.5.11),即存在於導致這樣的外部變量定義爲合併成一個POSIX系統(UNIX,Mac OSX上,Linux)的:

    J.5.11多重外部定義

    1. 有可能對多個外部定義對象的標識符,無論是否使用關鍵字extern;如果定義不一致,或者多於一個被初始化,則行爲是不確定的(6.9.2)。

    然而,其他平臺的C編譯器不一定遵循這個規則。


    如果你想這兩個文件有一個名爲x獨立變量,用關鍵字static,即static int x;前綴的每一個聲明。如果您希望它們是可移植的,則僅在一個文件中使用int x;extern int x;;這個extern al聲明可以放入一個頭文件中。