Qual é o objetivo de usar {
e }
em uma case
declaração? Normalmente, não importa quantas linhas existem em uma case
instrução, todas as linhas são executadas. Esta é apenas uma regra sobre compiladores mais antigos / mais recentes ou há algo por trás disso?
int a = 0;
switch (a) {
case 0:{
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
}
e
int a = 0;
switch (a) {
case 0:
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
c++
switch-statement
Mahmood
fonte
fonte
switch
palavra - chave e, no segundo exemplo, as instruções incluídas recuaram apenas uma vez. Observe como você tem um desajuste de quatro espaços de recuo após obreak;
.statement
. Em C ++, você pode (um componente da categoria sintáticastatement
édeclaration statement
).Respostas:
O
{}
denota um novo bloco de escopo .Considere o seguinte exemplo muito artificial:
Você obterá um erro do compilador porque
x
já está definido no escopo.Separá-los em seu próprio sub-escopo eliminará a necessidade de declarar
x
fora da instrução switch.fonte
TL; DR
A única maneira de declarar uma variável com um inicializador ou algum objeto não trivial dentro de um caso é introduzir um escopo de bloco usando
{}
ou outra estrutura de controle que tenha seu próprio escopo como um loop ou instrução if .Detalhes sangrentos
Podemos ver que os casos são apenas instruções rotuladas como os rótulos usados com uma instrução goto ( isso é abordado no esboço do padrão C ++ seção 6.1 Instrução rotulada ) e podemos ver na seção
6.7
parágrafo 3 que pular uma declaração não é permitido em muitos casos , incluindo aqueles com uma inicialização:e fornece este exemplo:
Observe que existem algumas sutilezas aqui, você pode pular uma declaração escalar que não possui uma inicialização, por exemplo:
é perfeitamente válido ( exemplo ao vivo ). Obviamente, se você quiser declarar a mesma variável em cada caso , cada um deles precisará de seu próprio escopo, mas funciona da mesma maneira fora das instruções switch , de modo que não deve ser uma grande surpresa.
Quanto à justificativa para não permitir o salto além da inicialização, o relatório de defeito 467, embora abranja uma questão ligeiramente diferente, fornece um caso razoável para variáveis automáticas :
É provavelmente mais interessante olhar para o caso em que você estende um escopo dentro de um switch sobre vários casos. Os exemplos mais famosos disso são provavelmente o dispositivo de Duff, que seria mais ou menos assim:
fonte
É um hábito que permite injetar declarações de variáveis com o destruidor resultante (ou conflitos de escopo) nas
case
cláusulas. Outra maneira de ver isso é que eles estão escrevendo para a linguagem que gostariam de ter, onde todo o controle de fluxo consiste em blocos e não sequências de declarações.fonte
Verifique esta uma restrição básica do compilador e você começará a se perguntar o que está acontecendo:
Isso gerará um erro:
Embora este não:
fonte
O uso de colchetes no switch denota um novo bloco de escopo, conforme dito por Rotem.
Mas também pode ser para maior clareza ao ler. Para saber onde o caso termina, pois você pode ter uma quebra condicional nele.
fonte
Os motivos podem ser:
fonte