tutorial - Definición variable Ignorar en C
handlebars if condition example (7)
El switch
salta directamente al case 1:
nunca ejecuta la tarea.
Código:
int main()
{
int a=1;
switch(a)
{
int b=20;
case 1:
printf("b is %d/n",b);
break;
default:
printf("b is %d/n",b);
break;
}
return 0;
}
Salida: Imprime algún valor de basura para b cuando tiene lugar la declaración de b aquí ¿Por qué b no se inicializa con 20 aquí?
Es una idea bastante mala inicializar B en virtud de la instrucción switch y fuera de una declaración de caso. Para entender lo que está pasando aquí, debe saber que el interruptor da un salto a la sentencia case / default correcta.
Las sentencias Switch solo evalúan partes del código que contienen, y no se puede poner el código en la parte superior y se espera que sea evaluado por cada componente de la caja. Necesita poner la inicialización b más arriba en el programa sobre la declaración de cambio. Si realmente necesita hacerlo localmente, hágalo en un conjunto separado de llaves:
Código:
int main()
{
int a=1;
/* other stuff */
{
int b=20;
switch(a)
{
case 1:
printf("b is %d/n",b);
break;
default:
printf("b is %d/n",b);
break;
}
}
/* other stuff... */
return 0;
}
Porque esa línea nunca se alcanza. Cuando C pulsa una instrucción switch(a)
, se bifurca al case
que coincide con la condición de la variable que está activando. La declaración que inicializa b
no está en ninguno de los casos. Supongo que el compilador puede escribir libremente 20
en la ubicación, pero el idioma no lo requiere y, en este caso, no: también es libre de dejar la inicialización hasta que realmente ejecute una tarea.
Presumiblemente, debido a que el switch
funciona como un goto
- si a == 1
, salta directamente al case 1:
y evita la inicialización de b
.
Es decir: sé que el switch
salta directamente a la etiqueta de la case
, pero estoy muy sorprendido de que el compilador no se queje de la inicialización perdida.
porque cuando el enunciado switch (a) ejecuta el control va directamente al enunciado caso 1: sin ejecutar el enunciado int b = 20, por eso da el valor basura como respuesta. Si desea imprimir una, entonces u tiene que inicializar en el caso 1: bloquear o debe inicializar a antes de la instrucción de cambio (a).
Porque la memoria se asignará para int b
pero cuando se ejecuta la aplicación " b = 20
" nunca se evaluará.
Esto se debe a que su declaración de switch
saltará a cualquiera de los case 1:
1 o por default:
omitiendo la afirmación en cuestión, por lo tanto, b
no se inicializará y se invoca el comportamiento indefinido.
Las siguientes dos preguntas (con sus respuestas aceptadas) serán de mayor ayuda en su búsqueda de respuestas:
¿Cómo se puede usar una variable cuando se omite su definición? 2
¿Por qué no se pueden declarar las variables en una instrucción switch?
Dando la vuelta a las advertencias / errores de tu compilador a un nivel superior, es de esperar que te brinde esta información cuando trates de compilar tu fuente.
A continuación se muestra lo que dice gcc
sobre el asunto;
foo.cpp:6:10: error: jump to case label [-fpermissive]
foo.cpp:5:9: error: crosses initialization of ''int b''
1 ya que int a
siempre será 1 (uno) siempre saltará aquí.
2 más relevantes de los dos enlaces, respondidos por mí.