En pocas palabras : lo que su maestro probablemente quiso decir es que la semántica de whilees más o menos la misma en la mayoría de los idiomas, mientras que la semántica de forpuede cambiar considerablemente (vea la discusión a continuación). Por lo tanto, las pruebas independientes del lenguaje abstracto son más confiables con a while, pero se debe tener cuidado de que una prueba con un forbucle no coincida con la semántica del forbucle en muchos idiomas.
Su pregunta no es lo suficientemente precisa (aunque puede que no sea su culpa).
El punto es que, afaik, no hay un estándar oficial, compatible con ISO, o una definición de referencia fory whilebucles aceptados oficialmente
. La definición depende del lenguaje de programación.
Por lo tanto, no puede hacer ninguna declaración general con respecto a su equivalencia antes de haber definido exactamente lo que cada uno puede hacer. Me refiero a eso más precisamente, ya que es uno de los principales argumentos utilizados en otras respuestas (y la discusión será útil en lo que sigue).
Sobre intertranslatabilidad de fory whilebucles
Resumen : depende del lenguaje de programación, pero siempre es posible siempre que pueda tener un bucle infinito y una forma de salir de él.
Pero puede hacer tal declaración para un lenguaje de programación específico, y la respuesta dependerá de las características del lenguaje.
Eso también significa que no hay pruebas generales, sino solo una para cada lenguaje de programación.
Una cosa que generalmente es cierta es que un whilebucle generalmente puede imitar un forbucle, porque el bucle while puede hacer la prueba de condición de salida del bucle for, realizar la inicialización de la variable de control con una asignación antes de ingresar al bucle y hacer el incremento al final del cuerpo del bucle, para que
for i from 1 by 2 to 10 do { xxx }
se convierte
i=1
while i≤11 do { xxx; i←i+2 }
Esto funciona más o menos para la mayoría de los idiomas, pero no es tan obvio como parece, y puede haber muchos "detalles" de los que preocuparse.
Por ejemplo, en muchos idiomas, el forbucle evalúa 3 argumentos (valor inicial, incremento y valor final) como argumentos estrictos , evaluados una vez antes de ingresar al bucle, mientras que otros tomarán luego como argumentos thunk para ser reevaluados en cada turno, o posiblemente como argumento perezoso para ser evaluado solo cuando sea necesario.
Otro punto puede ser que la variable de incremento puede ser local al
forbucle, o tener que ser una variable local de la función donde aparece el bucle.
Dependiendo de tales problemas, la traducción de a fora a whilepuede variar ampliamente, aunque generalmente es posible lograrlo.
Lo mismo vale para lo contrario, traduciendo a whileen un forbucle.
El primer problema es que un whilebucle siempre reevaluará la condición de salida en cada vuelta. Pero algunos forbucles no proporcionan una condición que se reevalúa en cada turno, aparte de la comparación de la variable de control con algún valor fijo calculado en la entrada del bucle. Entonces la traducción no es posible a menos que exista algún otro medio para salirse del ciclo en algunas condiciones arbitrarias.
Esto se puede lograr con varios dispositivos, generalmente comenzando con una declaración condicional que pruebe la condición, seguida de un salto implementado, según esté disponible, por una declaración de salida del ciclo, una declaración de retorno (después de encapsular el ciclo en una función), una declaración goto o un aumento de excepción.
En otras palabras, nuevamente depende mucho de los idiomas, y posiblemente de las características sutiles de los idiomas.
Esto dice, como respondió @milleniumbug , la intertranslación es fácil en el lenguaje C, porque un forlopp es esencialmente un whilebucle más algo extra para una variable de control incrementada.
Pero esto no se aplica necesariamente a otros idiomas, y muy probablemente no de la misma manera.
Dicho esto, generalmente se supone que los lenguajes de programación tienen poder de Turing con solo uno de estos bucles, ya que todo lo que necesita es un bucle infinito. Entonces, siempre y cuando tenga alguna forma de bucle para siempre, y posiblemente decida detenerse, está bastante seguro de que puede imitar cualquier otra construcción ... pero no necesariamente fácil.
En cuanto a las pruebas
Resumen : No conozco ninguna razón para afirmar que las pruebas deberían ser significativamente más difíciles con una u otra (a menos que alguna característica extraña del lenguaje).
Probablemente hay un malentendido, o tu maestro tenía su mente en otra cosa.
La semántica formal se puede definir para los diversos tipos de bucles definidos en los lenguajes de programación, y luego usarse para probar propiedades.
Puede ser, nuevamente según el idioma, que la realización de pruebas formales con respecto a los programas puede ser más compleja en algunos casos. Pero eso depende del idioma.
No puedo imaginar una razón por la cual las pruebas deberían ser significativamente más difíciles con una construcción más que con la otra. El forciclo puede ser más complejo ya que puede ofrecer, como en C, todo lo que se hace con un whileplus más. Pero si lo hicieras con un while, tendrías que agregar los extras en alguna otra forma.
Podría usar el argumento general formal de intertranslatabilidad, siempre y cuando exista la posibilidad de un solo bucle infinito. Sin embargo, me abstendré de hacer eso, ya que las construcciones involucradas no son nada con lo que quieras lidiar en una prueba, y claramente sería una declaración injusta, al menos en la práctica.
Sin embargo, siguiendo la discusión anterior, hemos visto que las dificultades para la intertranslatabilidad provienen de la gran variabilidad del forciclo de un idioma a otro. De ahí la siguiente conclusión, que probablemente sea la respuesta correcta:
Una posibilidad para comprender la afirmación de su maestro es que la semántica del whilebucle es prácticamente la misma en todos los lenguajes de programación, mientras que la sintaxis y la semántica del forbucle pueden variar significativamente de un idioma a otro. Por lowhilefor tanto, es posible hacer pruebas "abstractas" generales con bucles que tienen una semántica independiente del lenguaje en buena medida, mientras que esto no es posible para el bucle que tiene una sintaxis y una semántica que cambian demasiado de un idioma a otro. Pero esto no se aplica dentro de un lenguaje dado, cuando la semántica de ambos se define con precisión.
Mi mejor sugerencia es que le preguntes a tu maestro qué quiso decir exactamente y si puede darte un ejemplo. Frases o malentendidos es un evento común.
formáswhilesimplemente no tiene sentido. Puede haber uno, pero este no lo es.