2015-12-23 143 views
1

我有一個同名的本地變量和全局變量。具有相同名稱的全局變量和局部變量,意外值

int var = 10; 
int main() { 
    int var = var; 
    printf("%d", var); 
    return 0; 
} 

運行程序給出的輸出:0

這是爲什麼?

+0

本地定義覆蓋外部。它在本地範圍內。編譯器怎麼知道哪個是哪個? –

+0

我不知道你錯過了什麼:***「警告:變量'var'在初始化時使用未初始化」***。 – user3386109

+0

以及**警告:聲明在全局範圍**中隱藏一個變量。 –

回答

2

int var = var in main()實際上並未在文件範圍內訪問var

結果實際上是未定義的行爲,因爲它試圖訪問尚未初始化的本地var的值。所以你得到的任何結果(零,42,重新格式化你的硬盤)是有效的。

嘗試用不同的編譯器構建代碼,並且可以獲得不同的輸出。

出於好奇,我編譯,構建並運行相同的代碼(除了添加#include <stdio.h>),我收到的輸出是41944322。我當前機器上的編譯器是gcc 4.8.1(mingw)。

3

全局變量與它無關,你可以註釋掉那行代碼。當編譯器在另一個外部作用域中找到與另一個變量名稱相同的局部變量時,將始終使用局部變量。

因此,表達式int var = var;中的「var」均指本身:局部變量。將變量初始化爲它自己的未初始化值沒有任何意義。該值將保持不確定性,當您在程序中使用該值時,會調用未定義的行爲:任何事情都可能發生。

+0

從技術上講,編譯器在*相同*範圍內發現'var'。未定義的行爲已由初始化程序本身調用,並再次在'printf'語句中調用。 – chqrlie