2009-07-07 5 views
7

Tengo una pregunta simple que estoy planteando principalmente para mi curiosidad.¿Diferencia de rendimiento en las condiciones de bucle?

¿Cuáles son las diferencias entre estas dos líneas de código? (En C++)

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

La selección de las condiciones es completamente arbitraria, sólo estoy interesado en las diferencias entre, y & &.

No soy un principiante para la codificación de ninguna manera, pero nunca me he molestado con el operador de coma.

¿Hay diferencias de rendimiento/comportamiento o es puramente estético?

Una última nota, sé que hay peces de mayor rendimiento para freír que un operador condicional, pero solo tengo curiosidad. Complaceme.

Editar Gracias por la respuesta.

Resulta que el código que provocó esta pregunta había utilizado incorrectamente al operador de coma en la forma que he descrito. Me preguntaba cuál era la diferencia y por qué no era un operador & &, pero se escribió incorrectamente. No pensé que algo andaba mal porque funcionó bien. Gracias por enderezarme.

+0

¿Por qué le preocupa el rendimiento? En el tiempo que lleva obtener una respuesta a esta pregunta, los 9 nanosegundos que habría ahorrado utilizando una u otra notación ya estarían perdidos. "La optimización prematura es la raíz de todo mal ..." – Juliet

+17

No dijo que estaba preocupado, solo curiosidad. Realmente me gustaría que la gente dejara de ondear la bandera de "optimización prematura" cada vez que alguien "solo quiere saber". La curiosidad es una * buena cosa *. –

+5

Me pregunto cuánto tiempo se ahorraría si SO implementara un filtro que, cada vez que alguien menciona las palabras "rendimiento" o "más rápido" en una pregunta, simplemente publique automáticamente un comentario diciendo: "no se le permite pensar en eso, ciudadano, ahora vuelve al trabajo ";-) –

Respuesta

10

Aunque parece que,

for(int i = 0; i < N, N > 0; i++) 

y

for(int i = 0; i < N && N > 0; i++) 

no son equivalentes.

Aquí está la prueba.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

Resultado:

5 

Lo que significa que la hora de determinar cuando el bucle terminará usará N > 0. Si N = 10, esto significa que siempre será verdadero y que el bucle nunca saldrá.

Ejecute esto y vea la prueba.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

Si N es una constante o variable que no cambia dentro del bucle entonces se podría simplemente elimine la marca N > 0 comprobando una vez primera, es decir,

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

No sé por qué nadie votó esto. Me gusta una respuesta bien pensada y detallada cuando pido una explicación. Gracias – CodeFusionMobile

+3

No lo votaría porque no establece claramente la diferencia, y trata de determinar el significado por experimento, en lugar de mirar el estándar o cualquier documentación. –

+0

Me gustan los ejemplos y experimentos personalmente. La respuesta de RichieHindle fue breve y precisa, pero no muy descriptiva ni respondió a mi pregunta cuál es la diferencia real. Incluso si esta respuesta no detallara la razón detrás del problema, realmente respondió la pregunta. – CodeFusionMobile

33

Usando una coma como esta simplemente descartar la primera condición.

El operador de coma significa "ejecutar estas instrucciones en este orden y tomar el valor de la última".

+0

ya que en él lo ignora por completo y no realiza el control? – Victor

+2

El valor de "' i < N, N > 0' "es el mismo que el valor de" 'N> 0'". – ephemient

+1

@Victor: Compara i y N, descarta el resultado, luego compara N y 0 y usa el resultado para decidir si continúa el ciclo. En el código optimizado, probablemente no se molestará en comparar i y N. – RichieHindle

Cuestiones relacionadas