if (falso) vs. while (falso): código inalcanzable vs. código muerto

Intenté lo siguiente en Eclipse:

  • if (false) {} : advertencia ‘código muerto’
  • while (false) {} : error de comstackción ‘código inalcanzable

Me preguntaba si existe una “razón” real para esta diferencia. Ya encontré esto …

Error de comstackdor de código inalcanzable

… pero ¿por qué no permitirlo while (false) para el mismo propósito de depuración?

La sección JLS sobre el código inalcanzable explica el razonamiento. Esencialmente, Java normalmente no debería usar la comstackción condicional como C lo hace rutinariamente con #ifdef , pero hay algunas situaciones (como la depuración y, en particular, la compatibilidad binaria con versiones anteriores) donde es necesario permitir que el comstackdor elimine completamente el código, por lo que constructo específico if(false) está permitido para ese propósito.

Debes leer las Declaraciones inalcanzables . Aunque con while(false) el comstackdor generará un error pero con if(false) mostrará una advertencia al usuario.

Aunque if (false) se mantuvo en Java para simular el preprocesador C / C ++ #if 0

La especificación dice que:

if (falso) {x = 3; }

no da como resultado un error en tiempo de comstackción. Un comstackdor de optimización puede darse cuenta de que la statement x = 3; nunca se ejecutará y puede optar por omitir el código para esa statement del archivo de clase generado, pero la instrucción x = 3; no se considera “inalcanzable” en el sentido técnico especificado aquí.

La razón de este tratamiento diferente es permitirles a los progtwigdores definir “variables de bandera” tales como:

static boolean final DEBUG = false; y luego escribe un código como:

if (DEBUG) {x = 3; } La idea es que debería ser posible cambiar el valor de DEPURACIÓN de falso a verdadero o de verdadero a falso y luego comstackr el código correctamente sin ningún otro cambio en el texto del progtwig.