En pocas palabras : lo que su maestro probablemente quiso decir es que la semántica de while
es más o menos la misma en la mayoría de los idiomas, mientras que la semántica de for
puede 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 for
bucle no coincida con la semántica del for
bucle 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 for
y while
bucles 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 for
y while
bucles
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 while
bucle generalmente puede imitar un for
bucle, 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 for
bucle 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
for
bucle, o tener que ser una variable local de la función donde aparece el bucle.
Dependiendo de tales problemas, la traducción de a for
a a while
puede variar ampliamente, aunque generalmente es posible lograrlo.
Lo mismo vale para lo contrario, traduciendo a while
en un for
bucle.
El primer problema es que un while
bucle siempre reevaluará la condición de salida en cada vuelta. Pero algunos for
bucles 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 for
lopp es esencialmente un while
bucle 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 for
ciclo puede ser más complejo ya que puede ofrecer, como en C, todo lo que se hace con un while
plus 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 for
ciclo 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 while
bucle es prácticamente la misma en todos los lenguajes de programación, mientras que la sintaxis y la semántica del for
bucle pueden variar significativamente de un idioma a otro. Por lowhile
for
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.
for
máswhile
simplemente no tiene sentido. Puede haber uno, pero este no lo es.