A menudo veo dos formas de escribir para bucles.
El primero:
for (int i = 0; i < 10; i++) { ...... }El segundo:
int i; for (i = 0; i < 10; i++){ ...... }¿Hay alguna diferencia entre los dos métodos en términos de eficiencia de ejecución?
Como otros ya han señalado, la diferencia es el alcance y, en muchos casos, no hay diferencia en la eficiencia del programa.
En aras de poder depurar su código y razonar sobre lo que está haciendo, generalmente es recomendable tener variables para el alcance más pequeño posible. Cuanto más tiempo existe una variable, más cosas no deseadas puede hacerle. Si i no es necesario después del bucle, colóquelo localmente en el bucle.
Considere simplemente imprimir una matriz de enteros:
void print_array(int *arr, size_t n) { for (size_t i = 0; i < n; ++i) { printf("%d\n", arr[i]); } } Pero digamos que queremos encontrar el índice de un valor en una matriz int (donde i es n que indica que no se encontró el valor):
size_t find_index(int val, int *arr, size_t n) { size_t i; for (i = 0; i < n && arr[i] != val; ++i) { // Nothing required here. } return i; } En el último caso, el valor de i se necesitaba después de que se completara el bucle, por lo que no se podía aplicar localmente al bucle.
En términos de eficiencia de ejecución, no. Estos compilarán a la misma cosa. Vea la salida del compilador aquí . En cuanto a funcionalidad, sí, de forma muy minoritaria. El alcance de i es diferente. Entonces, en el segundo ejemplo podrías hacer esto:
int i; for (i = 0; i < 10; i++){ if (some_condition) { break; } ... } // use i for some other purpose, like indexing a vector or something. Pero debido al alcance de i , no puede hacer esto en el primer bucle.
La diferencia es que, en el segundo fragmento de código, la variable i está disponible (para inspección y uso) después de que el ciclo for haya terminado de ejecutarse; en el primer fragmento, no lo es.
Si no usa/inspecciona esa variable i después del ciclo (es decir, después del cierre } ), entonces un compilador de optimización probablemente producirá el mismo código para ambos.