Declarando variables ​​dentro de uma instrução switch

Eu vi algumas respostas para este problema, e eu entendi – você não pode declarar e atribuir variables ​​dentro de um switch . Mas eu estou querendo saber se o seguinte está correto em lançar um erro dizendo

erro: expressão esperada antes de ‘int’

Código:

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

Por que colocar uma chamada para NSLog() antes de resultar em nenhum erro?

 switch (i) { case 0: NSLog(@"wtf"); int j = 1; break; } 

Você pode realmente declarar variables ​​dentro de um switch se você fizer isso de acordo com a syntax do idioma. Você está recebendo um erro porque ” case 0: ” é um label e em C é ilegal ter uma declaração como a primeira instrução após um label – observe que o compilador espera uma expressão , como uma chamada de método, atribuição normal, etc. (Por mais bizarro que seja, essa é a regra.)

Quando você coloca o NSLog () primeiro, você evitou essa limitação. Você pode colocar o conteúdo de um caso em chaves {} para introduzir um bloco de escopo ou pode mover a declaração de variável fora do comutador. Qual você escolhe é uma questão de preferência pessoal. Apenas esteja ciente de que uma variável declarada em {} chaves só é válida dentro desse escopo, portanto, qualquer outro código que a utilize também deve aparecer dentro dessas chaves.


Editar:

A propósito, essa peculiaridade não é tão incomum quanto você imagina. Em C e Java, também é ilegal usar uma declaração de variável local como a instrução solitária (significando “não cercada por chaves” em um loop for , while ou do , ou mesmo em cláusulas if e else . (Na verdade, isso é cobertos no quebra-cabeças # 55 de “Java Puzzlers” , que eu recomendo. Acho que geralmente não escrevemos tais erros, porque faz pouco sentido declarar uma variável como a única declaração em tais contextos. No caso de construções, no entanto, algumas pessoas omitem as chaves, já que a instrução break é a declaração crítica para o stream de controle.

Para ver os ajustes do compilador, copie este trecho horrível e sem sentido para o seu código (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); 

Ainda outra razão para usar sempre {} chaves para delimitar o corpo de tais construções. 🙂

Eu me deparei com esse problema antes, e a conclusão foi que você acabou de colocar o código dentro de um bloco.

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

Outra solução simples que uso é adicionar uma expressão vazia (ponto-e-vírgula) antes da declaração. Isso evita limitar o escopo da variável a um bloco de código (ou ter algumas instruções de caso com blocos de código e algumas sem).

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