Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

171
Visualizações
¿Se supone que funciona el uso de if (0) para omitir un caso en un interruptor?

Tengo una situación en la que me gustaría que dos casos en una declaración de cambio de C++ caigan en un tercer caso. Específicamente, el segundo caso caería en el tercer caso, y el primer caso también caería en el tercer caso sin pasar por el segundo caso.

¡Tuve una idea tonta, la probé y funcionó! Envolví el segundo caso en un if (0) { ... } . Se parece a esto:

 #ifdef __cplusplus # include <cstdio> #else # include <stdio.h> #endif int main(void) { for (int i = 0; i < 3; i++) { printf("%d: ", i); switch (i) { case 0: putchar('a'); // @fallthrough@ if (0) { // fall past all of case 1 (!) case 1: putchar('b'); // @fallthrough@ } case 2: putchar('c'); break; } putchar('\n'); } return 0; }

Cuando lo ejecuto, obtengo el resultado deseado:

 0: ac 1: bc 2: c

Lo probé tanto en C como en C++ (ambos con sonido metálico) e hizo lo mismo.

Mis preguntas son: ¿Es válido C/C++? ¿Se supone que debe hacer lo que hace?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Sí, se supone que esto funciona. Las etiquetas de caso para una declaración de cambio en C son casi exactamente como las etiquetas goto (con algunas advertencias sobre cómo funcionan con declaraciones de cambio anidadas). En particular, no definen bloques por sí mismos para las declaraciones que usted piensa que están "dentro del caso", y puede usarlos para saltar al medio de un bloque tal como lo haría con un goto. Al saltar a la mitad de un bloque, se aplican las mismas advertencias que con goto con respecto a saltar sobre la inicialización de variables, etc.

Dicho esto, en la práctica probablemente sea más claro escribir esto con una instrucción goto, como en:

 switch (i) { case 0: putchar('a'); goto case2; case 1: putchar('b'); // @fallthrough@ case2: case 2: putchar('c'); break; }
over 4 years ago · Santiago Trujillo Relatório

0

Sí, esto está permitido, y hace lo que quieres. Para una declaración de switch , el estándar C++ dice :

Las etiquetas de mayúsculas y minúsculas en sí mismas no alteran el flujo de control, que continúa sin impedimentos a través de tales etiquetas. Para salir de un interruptor, vea descanso.

[Nota 1: por lo general, la subdeclaración que es objeto de un cambio es compuesta y las etiquetas de mayúsculas y minúsculas aparecen en las declaraciones de nivel superior contenidas dentro de la subdeclaración (compuesta), pero esto no es obligatorio. Las declaraciones pueden aparecer en la subdeclaración de una declaración de cambio. - nota final]

Entonces, cuando se evalúa la declaración if , el flujo de control procede de acuerdo con las reglas de una declaración if , independientemente de las etiquetas de caso intermedias.

over 4 years ago · Santiago Trujillo Relatório

0

Como han mencionado otras respuestas, esto está técnicamente permitido por el estándar, pero es muy confuso y poco claro para los futuros lectores del código.

Esta es la razón por la que las sentencias switch ... case generalmente deben escribirse con llamadas a funciones y no con mucho código en línea.

 switch(i) { case 0: do_zero_case(); do_general_stuff(); break; case 1: do_one_case(); do_general_stuff(); break; case 2: do_general_stuff(); break; default: do_default_not_zero_not_one_not_general_stuff(); break; }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda