Noté que las reglas de alcance del ciclo for son diferentes para C y C++.
Por ejemplo, el siguiente código es legal en el compilador de C, pero no legal en el compilador de C++.
for (int i = 0; i < 10; ++i) { int i = 5; } El código anterior es válido en C, pero da un error de redefinición en C++.
Supongo que el compilador de C trata el ciclo como si hubiera otro ámbito dentro del ciclo como se muestra a continuación.
for (int i = 0; i < 10; ++i) { { int i = 5; } }¿Por qué el compilador de C permite que se defina una segunda variable con el mismo nombre en el alcance del bucle? ¿Hay alguna razón o ventaja en particular para hacer esto?
En lo que respecta a los estándares, los ámbitos for se definen de manera diferente en C y en C++. En C se definen de la siguiente manera:
6.8.5.3 La sentencia for
La declaración
for (cláusula-1; expresión-2; expresión-3) declaración
se comporta de la siguiente manera: ...
sin referencia específica dada a las limitaciones en las declaraciones de variables dentro de la statement . La descripción de nivel superior de los bucles ("declaraciones de iteración" en el estándar) especifica:
Una declaración de iteración es un bloque cuyo alcance es un subconjunto estricto del alcance de su bloque adjunto. El cuerpo del ciclo también es un bloque cuyo alcance es un subconjunto estricto del alcance de la declaración de iteración.
como ha insinuado en su pregunta, codifique como:
for (int i = 0; i < 10; ++i) int i = 5; donde no se declara un nuevo bloque (observe que falta { } alrededor de la nueva declaración), no es un código válido.
Mientras que en C++, hay una referencia específica a la redeclaración de variables de bucle:
8.6 Las sentencias de iteración especifican bucles... Si un nombre introducido en una sentencia de inicio o en una declaración de rango se vuelve a declarar en el bloque más externo de la subsentencia, el programa está mal formado .
En lo que respecta a la lógica, es probable que C ++ solo agregue la restricción como una mejora en la semántica del lenguaje, de hecho, volver a declarar una variable de esta manera suele ser un error.
Podría decirse que esta restricción también es apropiada en C, pero agregar esta restricción al estándar C rompería la compatibilidad con el código existente y es poco probable que suceda.