3 回答

TA貢獻(xiàn)1887條經(jīng)驗 獲得超5個贊
如果您根據(jù)語言的語法進(jìn)行操作,則實際上可以在開關(guān)中聲明變量。由于出現(xiàn)錯誤,因為“ case 0:”是標(biāo)簽,在C語言中,在標(biāo)簽后的第一個語句中聲明為非法是非法的-請注意,編譯器需要表達(dá)式,例如方法調(diào)用,常規(guī)賦值等。(盡管可能很奇怪,但這是規(guī)則。)
當(dāng)您首先放置NSLog()時,避免了此限制。您可以將案例的內(nèi)容括在{}中以引入作用域,也可以將變量聲明移到開關(guān)之外。您選擇哪種取決于個人喜好。請注意,用{}括號聲明的變量僅在該范圍內(nèi)有效,因此使用該變量的任何其他代碼也必須出現(xiàn)在這些括號內(nèi)。
編輯:
順便說一下,這種怪異并不像您想象的那樣普遍。在C和Java中,在for,while或do循環(huán)甚至if和else子句中使用局部變量聲明作為lone語句(意思是“不用大括號括起來”)也是非法的(實際上,這是覆蓋益智游戲#55 “的Java謎題”,我強烈建議)。我認(rèn)為,我們一般不寫這樣的錯誤開始,因為這是毫無意義的變量聲明為在這樣的背景下的語句。隨著開關(guān) / 但是,案例構(gòu)造有些人在休息后就省略了花括號 語句是控制流的關(guān)鍵語句。
要查看編譯器是否符合要求,請將以下可怕的,毫無意義的代碼段復(fù)制到您的(Objective-)C代碼中:
if (1)
int i;
else
int i;
for (int answer = 1; answer <= 42; answer ++)
int i;
while (1)
int i;
do
int i;
while (1);
始終使用{}大括號分隔此類構(gòu)造體的另一個原因。:-)

TA貢獻(xiàn)1818條經(jīng)驗 獲得超7個贊
我之前曾遇到過這個問題,結(jié)論是您只是將代碼放在了一個塊中。
switch (i) {
case 0:
{
int j = 1;
break;
}
}

TA貢獻(xiàn)1911條經(jīng)驗 獲得超7個贊
我使用的另一個簡單的解決方法是在聲明之前添加一個空表達(dá)式(分號)。這避免了將變量范圍限制為代碼塊(或某些case語句帶有代碼塊,而有些case語句沒有代碼塊)。
switch (i) {
case 0:;
int j = 1;
break;
}
- 3 回答
- 0 關(guān)注
- 811 瀏覽
添加回答
舉報