¿Qué sentido tiene usar {
y }
en una case
declaración? Normalmente, no importa cuántas líneas haya en una case
declaración, todas las líneas se ejecutan. ¿Es esto solo una regla con respecto a los compiladores más antiguos / nuevos o hay algo detrás de eso?
int a = 0;
switch (a) {
case 0:{
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
}
y
int a = 0;
switch (a) {
case 0:
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
c++
switch-statement
Mahmood
fuente
fuente
switch
palabra clave y, en el segundo ejemplo, las declaraciones adjuntas solo se sangran una vez. Tenga en cuenta que tiene un incómodo desangrado de cuatro espacios después delbreak;
.statement
. En C ++, puede (un componente de la categoría sintácticastatement
esdeclaration statement
).Respuestas:
El
{}
denota un nuevo bloque de alcance .Considere el siguiente ejemplo muy elaborado:
Obtendrá un error del compilador porque
x
ya está definido en el alcance.Separarlos en su propio subámbito eliminará la necesidad de declarar
x
fuera de la declaración de cambio.fuente
TL; DR
La única forma en que puede declarar una variable con un inicializador o algún objeto no trivial dentro de un caso es introducir un alcance de bloque usando
{}
u otra estructura de control que tenga su propio alcance como un bucle o una declaración if .Detalles sangrientos
Podemos ver que los casos son solo declaraciones etiquetadas como las etiquetas que se usan con una declaración goto ( esto se cubre en la sección 6.1 Declaración etiquetada del borrador del estándar de C ++ ) y podemos ver en el
6.7
párrafo 3 de la sección que saltar una declaración no está permitido en muchos casos , incluidos aquellos con una inicialización:y proporciona este ejemplo:
Tenga en cuenta que aquí hay algunas sutilezas, se le permite saltar más allá de una declaración escalar que no tiene una inicialización, por ejemplo:
es perfectamente válido ( ejemplo vivo ). Por supuesto, si desea declarar la misma variable en cada caso , cada uno necesitará su propio alcance, pero también funciona de la misma manera fuera de las declaraciones de cambio , por lo que no debería ser una gran sorpresa.
En cuanto a la justificación para no permitir el salto después de la inicialización, el informe de defectos 467, aunque cubre un problema ligeramente diferente, proporciona un caso razonable para las variables automáticas :
Probablemente sea más interesante observar el caso en el que extiende un alcance dentro de un interruptor sobre varios casos, los ejemplos más famosos de esto probablemente sean el dispositivo de Duff, que se vería así:
fuente
Es un hábito que le permite inyectar declaraciones de variables con el destructor resultante (o conflictos de alcance) en
case
cláusulas. Otra forma de verlo es que están escribiendo para el lenguaje que desearían tener, donde todo el control de flujo consiste en bloques y no en secuencias de declaraciones.fuente
Verifique que esta es una restricción básica del compilador y comenzará a preguntarse qué está pasando:
Esto le dará un error:
Si bien este no lo hará:
fuente
El uso de corchetes en el interruptor denota un nuevo bloque de alcance como lo dijo Rotem.
Pero también puede serlo para mayor claridad al leer. Para saber dónde se detiene el caso, ya que podría tener una ruptura condicional.
fuente
Las razones pueden ser:
fuente