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;
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
3 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
czy możesz
deklaruj zmienne wewnątrz przełącznika, jeśli robisz to zgodnie ze składnią języka. Otrzymujesz błąd, ponieważ „ ” 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:
Kolejny powód, aby zawsze używać nawiasów klamrowych {} do oddzielania treści takich konstrukcji. :-)
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: