我很困惑,我爲什麼允許這樣做(if語句是隻顯示範圍):Objective-C的變量聲明混亂
int i = 0;
if(true)
{
float i = 1.1;
}
我有一個C#背景,這樣的事情是不是允許。基本上,程序員重新聲明變量'i',從而賦予'我'一個新的含義。任何洞察力將不勝感激。
謝謝!
我很困惑,我爲什麼允許這樣做(if語句是隻顯示範圍):Objective-C的變量聲明混亂
int i = 0;
if(true)
{
float i = 1.1;
}
我有一個C#背景,這樣的事情是不是允許。基本上,程序員重新聲明變量'i',從而賦予'我'一個新的含義。任何洞察力將不勝感激。
謝謝!
在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
}
}
C#標準,可能是因爲它擁有的是一個錯誤的概率高,但C /目標C沒有問題用它。
你是部分正確的,是的,它給i
一個新的含義,但它不是重新聲明變量。這是另一個變量。但由於標識符相同,當前範圍將「隱藏」前一個,因此在該塊內使用i
就是指浮動。
你沒有重新定義i
,多達shadowingi
。這僅在i
的聲明處於不同級別的範圍時纔有效。 C#允許使用陰影,但不適用於if
語句/ switch
語句,而C/C++/Objective-C允許使用這種陰影。
在內部i
超出範圍之後,標識符i
將再次參考i
的int
版本。所以它不會改變原來的i
所指的。隱藏變量通常是不是你想做的事情(除非你小心,陰影可能是一個錯誤,特別是對於初學者來說)。
我明白了。謝謝你的解釋。它幫助明確了這一點。謝謝! – crizzwald 2013-05-07 15:11:49
像往常一樣:) – 2013-05-07 15:12:37
@Amin下面說了什麼 - 打開「隱藏的局部變量」警告讓編譯器barf在這個。強烈推薦。 – bbum 2013-05-07 15:44:07