2013-05-07 59 views
3

我很困惑,我爲什麼允許這樣做(if語句是隻顯示範圍):Objective-C的變量聲明混亂

int i = 0; 
if(true) 
{ 
    float i = 1.1; 
} 

我有一個C#背景,這樣的事情是不是允許。基本上,程序員重新聲明變量'i',從而賦予'我'一個新的含義。任何洞察力將不勝感激。

謝謝!

回答

4

在C語言中(以及在擴展中,在Objective C中),它允許在內部作用域聲明局部變量來隱藏外部作用域的變量。你可以擺脫if和寫:決定針對

int i = 0; 
{ 
    // Here, the outer i becomes inaccessible 
    float i = 1.1; 
    { 
     int i = 2; 
     printf("%d", i); // 2 is printed 
    } 
} 

demo

C#標準,可能是因爲它擁有的是一個錯誤的概率高,但C /目標C沒有問題用它。

+0

我明白了。謝謝你的解釋。它幫助明確了這一點。謝謝! – crizzwald 2013-05-07 15:11:49

+0

像往常一樣:) – 2013-05-07 15:12:37

+1

@Amin下面說了什麼 - 打開「隱藏的局部變量」警告讓編譯器barf在這個。強烈推薦。 – bbum 2013-05-07 15:44:07

1

你是部分正確的,是的,它給i一個新的含義,但它不是重新聲明變量。這是另一個變量。但由於標識符相同,當前範圍將「隱藏」前一個,因此在該塊內使用i就是指浮動。

1

你沒有重新定義i,多達shadowingi。這僅在i的聲明處於不同級別的範圍時纔有效。 C#允許使用陰影,但不適用於if語句/ switch語句,而C/C++/Objective-C允許使用這種陰影。

在內部i超出範圍之後,標識符i將再次參考iint版本。所以它不會改變原來的i所指的。隱藏變量通常是不是你想做的事情(除非你小心,陰影可能是一個錯誤,特別是對於初學者來說)。

3

打開構建設置中的「隱藏本地變量」以獲得警告。

+0

不錯的提示!謝謝! – crizzwald 2013-05-07 15:42:07