2009-07-10 9 views
6

Antes que nada, antes de comenzar, estoy usando VC++ 2008 professional, ejecutando un Intel core2 en Windows OS. También sé que este código NUNCA se ejecutará en otra cosa que no sea core2/corei7 con Windows.Condición orden en while loop

Tengo un ciclo while con 2 condiciones que se parece a esto: nota: esta es una versión mucho más simplificada. será la segunda condición aún evaluarse

while((a != b) && (array[a] < c)) 

Si la primera condición (a != b) genera una falsa,? o el bucle terminará justo allí?

Hice algunas pruebas y parece que es verdad.

Sin embargo, este es el truco. Cuando y si la primera condición evalúa falsa, la segunda condición GENERARÁ una infracción de acceso si se evalúa. Sin embargo, por lo que puedo ver, una vez que la primera condición se evalúa como falsa, el programa no se molesta en evaluar la segunda condición y abandona el ciclo, y así me salvó.

El problema es que no puedo deshacerme del problema de violación de acceso sin hacer que mi muy lindo y limpio código explote repentinamente sobre mí. Sin embargo, debido al pequeño "error" (sé que es una optimización del compilador, no un error), parece que puedo alejarme de eso. También sé que probablemente esta no sea una buena práctica de programación, pero para ser honesto, en mi situación, si funciona, ya estoy adelantado al juego.

Mi pregunta es, ¿este "error" o mala práctica de programación volverá y me morderá algún día? Incluso cuando se considera que probé el infierno de esta sección y ¿SOLO LO UTILIZARÉ ESTA VEZ ÚNICAMENTE?

+0

¡Vaya! ¡Tienes muchas preguntas! Deberías agregar mi messenger jaja –

+0

¡De nuevo! Te enviaré un mensaje en MM y te daré mi mensajera. ¡Amigo, son como las 3AM más allá de donde estás! ¿Tú no duermes? ¿Te gusta ... vivir aquí? (Estoy despierto hasta tan tarde porque es el único momento en el que todos los demás están dormidos y no me molestan, así puedo hacer un trabajo en mi tesis). – Faken

+0

Reviso mis pocos sitios periódicamente y sus preguntas son siempre las que captan mi interés y están cerca de la parte superior de la página. Se está poniendo un poco de miedo. De hecho, me levanto temprano, gimnasio en 2 horas. –

Respuesta

22

La segunda condición no se evaluará a menos que la primera se haya evaluado como verdadera. Puedes contar con esto Millones de líneas de código funcionan porque así es como C y C++ hacen una evaluación de expresiones lógicas de currículum corto.

Puede usarlo y contar con él. Si la primera expresión se evalúa como falsa, la segunda ni siquiera comenzará la evaluación.

+3

Pero, ¿está bien usar aunque la segunda condición pueda causar que el programa falle si alguna vez se evalúa en el estado que hace que la primera condición devuelva falso? – Faken

+0

Sí, cualquier implementación de C++ que cumpla con los estándares lo garantizará. – sharptooth

+1

@Faken - Sí, está bien. ¡No te preocupes! –

2

No se evaluará. Sin embargo, si le preocupa, en general, que una rutina que usted codifica volverá a morder, debería volver a evaluar lo que está escribiendo. Usted ha admitido que es una práctica de programación deficiente. Ya sabes que va a ser un problema. Cuando se cumplan esas condiciones, solo soluciona el problema. Te odiarás menos por la mañana.

+0

Lo entiendo, pero mis 13 lindas y bonitas líneas de código que he escrito dependen de que funcionen correctamente ... Tengo mucho que perder MUCHO velocidad y eficiencia de interms si lo arreglo. Cuando digo MUCHO, quiero decir que la ejecución del código será del orden de 2-3 veces más lento. – Faken

+0

Simplemente no se preocupe. También escribimos código dependiendo de la evaluación de currículum corto. No esperas que el ciclo while comience si la condición de bucle es falsa al principio, ¿o sí? Lo mismo va aquí. – sharptooth

+0

Estoy interesado, ¿por qué estás de acuerdo en que es una mala práctica de programación? –

4

Esto no es un error. C++ utiliza la evaluación de cortocircuito, por lo que la segunda condición nunca se evaluará cuando la primera condición sea falsa.

1

El lenguaje garantiza este comportamiento de cortocircuito, por lo que no debe preocuparse por nada. También funciona con || - si la primera condición es verdadera, la segunda no se evalúa.

1

Confiando en el cortocircuito, el comportamiento de cortocircuito de los operadores lógicos AND y OR de C++ no debe considerarse una mala práctica. Es perfectamente idiomático y a menudo conduce a un código más claro y conciso.

E.g.

std::auto_ptr<SomeObject> data; 

Con cortocircuitar &&:

// Clear expired data, if present 
if(data.get() && data->expired) 
    data.reset(); 

Sin utilizar el cortocircuito de && necesita un nivel adicional de if que conduce a un código más detallado.

// Clear expired data, if present 
if(data.get()) 
{ 
    if (data->expired) 
     data.reset(); 
} 
1

La segunda condición no se evaluará cuando la primera condición no sea verdadera. Como dijo, esta optimización es seguida por todos los compiladores de C++.

Si aún no puede ir con él, agregue una simple instrucción if de vez en cuando.

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
}