Deklarowanie zmiennych w instrukcji switch


Widziałem kilka odpowiedzi na to pytanie i rozgryzłem to - nie możesz deklarować i przypisywać zmiennych wewnątrz
switch
. Ale zastanawiam się, czy poniższe informacje są poprawne podczas generowania komunikatu o błędzie

błąd: oczekiwano wyrażenia przed „int”

Kod:
switch (i) {
case 0:
int j = 1;
break;
}

Dlaczego wywołanie
NSLog ()
wcześniej nie zwróci błędów?
switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Naprawdę

czy możesz

deklaruj zmienne wewnątrz przełącznika, jeśli robisz to zgodnie ze składnią języka. Otrzymujesz błąd, ponieważ „
case 0:
” to etykieta, aw języku C nie wolno mieć

ogłoszenie

jako pierwsza instrukcja po etykiecie - zwróć uwagę, że kompilator oczekuje wyrażenia

, takie jak wywołanie metody, wspólne przypisanie itp. (Chociaż jest to dziwne, taka jest reguła).
Kiedy umieszczasz NSLog () jako pierwszy, unikasz tego ograniczenia. Możesz ująć zawartość wywołania w nawiasy klamrowe {}, aby wprowadzić blok zakresu lub przenieść deklarację zmiennej poza przełącznik. To, który wybierzesz, zależy od osobistych preferencji. Pamiętaj tylko, że zmienna zadeklarowana w nawiasach {} jest ważna tylko w tym zakresie, więc każdy inny kod, który jej używa, powinien również pojawić się w tych nawiasach.

Edytować

:
Nawiasem mówiąc, to dziwactwo nie jest tak niezwykłe, jak mogłoby się wydawać. W C i Javie zabrania się również używania deklaracji zmiennej lokalnej jako pojedynczej instrukcji (to znaczy „nie w nawiasach klamrowych”) w pętli

for

,

while

,

do

lub nawet w zdaniach

if

i

else
... (Jest to właściwie opisane w zagadce # 55 z

"Java Puzzlers"
http://www.javapuzzlers.com/
co bardzo polecam.) Myślę, że zazwyczaj nie piszemy takich błędów, ponieważ w takich kontekstach nie ma sensu deklarowanie zmiennej jako pojedynczej instrukcji. Jednak w konstrukcjach

switch

/

case

niektórzy ludzie pomijają nawiasy klamrowe od czasu operatora

break

jest operatorem krytycznym dla kontroli przepływu.
Aby zobaczyć, jak pasuje rzucany przez kompilator, skopiuj ten brzydki, bezcelowy fragment do kodu (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);

Kolejny powód, aby zawsze używać nawiasów klamrowych {} do oddzielania treści takich konstrukcji. :-)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Już wcześniej napotkałem ten problem i wniosek był taki: po prostu umieszczasz kod w bloku.
switch (i) {
case 0:
{
int j = 1;
break;
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Innym prostym obejściem, którego używam, jest dodanie pustego wyrażenia (średnika) przed deklaracją. Pozwala to uniknąć ograniczenia zakresu zmiennej do bloku kodu (lub niektórych instrukcji case z blokami kodu, a innych bez).
switch (i) {
case 0:;
int j = 1;
break;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się