values tutorial studio handlebars ggplot example c variables

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:

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í.