Tengo la tarea de reescribir un software antiguo para mi empresa y encontré una construcción interesante dentro de las fuentes.
switch(X){ if(Y==Z){ case A: ... break; case B: ... break; } case C: ... break; default: ...; }El compilador me advierte que el código dentro de la declaración if no se ejecutará, pero durante la prueba parece que la declaración if no está validada, sin embargo, las declaraciones case sí lo están.
¿Hay alguna razón, tal vez los primeros días de C ++, ya que parte del código tiene más de 20 años, por qué escribiría una construcción como esa? Está en código de producción, ¿así que parece hacer algo?
Estaría agradecido por cualquier información interna de por qué esto podría haberse hecho y si puedo ignorarlo como parece hacer el compilador.
Editar: también ocurre varias veces, por lo que no parece ser un simple error. Esto es lo que me está confundiendo.
Edit2: Aquí está el ejemplo que usé para probar. No estoy seguro de cuán útil es, sin embargo, el código original está dentro de una función de monstruo de 1200 líneas, por lo que crear uno a partir de eso es básicamente imposible.
for (int i=0; i<5;i++) { switch(i) { if (i==0 || i ==1) { cout << "reached before case"; case 0: cout << "inside case 0" << std::endl; break; case 1: cout << "inside case 1" << std::endl; break; case 2: cout << "inside case 2" << std::endl; break; } case 3: cout << "inside case 3" << std::endl; break; default: cout << "inside default" << std::endl; } }¿Hay alguna razón... por la que escribirías una construcción como esa?
Solo el autor lo sabe con seguridad (incluso ellos podrían no saberlo). Si hay metadatos de control de versiones de origen disponibles, el mensaje de confirmación asociado podría ser útil. Sin más información, solo podemos adivinar lo que estaban pensando. Algunas posibles respuestas: