3 回答

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

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

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