2011-11-05 12 views
19
int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
} 

¿El código anterior es válido? ver si estoy muy seguro de que int a no tendrá ningún valor en lugar de 1 y 0, entonces en ese caso puedo evitar el valor predeterminado:?¿Qué pasa si no escribo el valor predeterminado en la caja del interruptor?

¿Qué pasa si, en cualquier caso, un valor será diferente de 1 y 0?

Editar: Yo sé que esto es pregunta tonta, pero yo estaba pensando que tal vez sería un comportamiento ilegal o no está definida por lo que sólo se le preguntó para asegurarse de

+6

lo he intentado, pero estaba pensando que tal vez sería un comportamiento ilegal o indefinido, así que solo me pedí que me asegurara de que –

+0

En tales casos siempre pongo un valor predeterminado y lanzo una excepción. Ahora en C# 7 con la mayor flexibilidad de "caso cuando" he pasado a cubrir todos los casos posibles y usar los valores predeterminados para cubrir los imposibles. Douglas Adams entendería esa perspectiva. – Paulustrious

Respuesta

47

El código es válido. Si no hay una etiqueta default: y ninguna de las etiquetas case coincide con el valor "conmutado", entonces no se ejecutará ninguna de las declaraciones compuestas controladas. La ejecución continuará desde el final de la declaración de cambio.

ISO/IEC 9899: 1999, sección 6.8.4.2:

[...] Si no convertidos case partidos de expresión constante y no hay una etiqueta default, se ejecuta ninguna parte del cuerpo del interruptor.

2

Es válida para no tener un caso default.

Sin embargo, incluso si está seguro de que no tendrá ningún valor en lugar de 1 y 0, es una buena práctica tener un caso por defecto, para recoger cualquier otro valor (aunque es teóricamente imposible, puede aparece en algunas circunstancias, como desbordamiento de búfer) e imprime un error.

+0

Está asumiendo que es un error no hacer coincidir una de las declaraciones de casos, probablemente sea cierto en este caso. Es posible que desee realizar solo una acción con algunos valores posibles de una variable y continuar en otros casos. En mi humilde opinión, este es un uso perfectamente razonable de una declaración de cambio. –

+0

@Charles: Escribió en la pregunta: ver si estoy muy seguro de que int a no tendrá ningún valor en lugar de 1 y 0, entonces en ese caso puedo evitar el valor predeterminado: –

+1

No estaba en desacuerdo contigo, ' Lo siento si ocurrió así. Solo estaba señalando que, aunque, en general, es una buena práctica tener una etiqueta 'predeterminada', no es necesariamente una mala práctica omitir una. –

7

Es un código perfectamente legal. Si a no es 0 o 1, entonces el bloque de interruptor se saltará por completo.

2

sí el código anterior es válida,

si la condición de conmutación no coincide con ninguna condición de la caja y un defecto no está presente la ejecución del programa que adelante la salida del interruptor sin hacer nada.

21

Como han señalado otros, es un código perfectamente válido. Sin embargo, desde una perspectiva de estilo de codificación, prefiero agregar una declaración default vacía con un comentario para dejar en claro que no me olvidé de ello involuntariamente.

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

El código generado con/sin default debe ser idéntico.

+3

+1 para comunicar la intención. – weberc2

+0

+1 Busqué en Google esperando una respuesta como esta. – Suzi

+1

Si intenta manejar todos los casos en una enumeración, recomendaría * omitir * el caso predeterminado, porque la mayoría de los compiladores advertirán si se olvida una enumeración en una declaración de cambio. – rdb

-2

I Suggest Each Case Must Have A "default:" In The End Me gusta Este código! , sería bueno tener un "default:" Caso en todo caso de error se producen o cambios que usted podría avisar al usuario de un valor erróneo

int a=10; 
switch(a) 
{ 
case 0: printf("case 0"); 
     break; 
case 1: printf("case 1"); 
     break; 
default: // do nothing; 
     break; 
} 

pero todavía caso puede funcionar sin "default:", como if declaraciones, puede ejecutar if() sin else()

+1

¿Cómo responde esto la pregunta? ¿Y qué agrega que no se haya dicho ya en la respuesta aceptada? (Además, debería considerar perder las exclamaciones). –

1

Es igual que no si se cumple la condición y no se proporciona.

por defecto no es obligatorio en la caja del interruptor. Si no se combinan los casos y no se proporciona el valor predeterminado, simplemente no se ejecutará nada.

2

El valor predeterminado no es obligatorio, pero siempre es bueno tenerlo. El código es ideal, pero nuestra vida no es, no hay daño para poner una protección allí. También lo ayudará a eliminar errores si ocurre algo inesperado.

Cuestiones relacionadas