Pregunta

En primer lugar, antes de empezar, estoy usando VC ++ 2008 profesional, la ejecución de un Core 2 de Intel en el sistema operativo Windows. También sé que el código nunca será ejecutado en otra cosa que un Core 2 / Corei7 con Windows.

Tengo un bucle while con 2 condiciones que se ve algo como esto: Nota:. esta es una versión muy simplificada

while((a != b) && (array[a] < c))
será la segunda condición aún evaluarse

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

Hice algunas pruebas y parece que sí es cierto.

Sin embargo, aquí está la trampa. Cuando y si la primera condición se evalúa como falsa, la segunda condición generará una violació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 se cierra el bucle, con el consiguiente ahorro de mí.

El problema es que yo no puedo deshacerme del problema de acceso violación sin hacer mi código muy agradable y limpio golpe de repente en mí. Sin embargo, debido a la poca "error" (sé que es una optimización del compilador, no es un error), que parecen ser capaces de alejarse de ella. También sé que esto probablemente no es una buena práctica de programación que hacer, pero para ser honesto, en mi situación, si funciona, ya estoy por delante del juego.

Mi pregunta es, ¿este "error" o mala práctica de programación volver y muérdeme algún día? Incluso si se considera que probé el infierno fuera de esta sección y sólo utilizarán esta vez?

¿Fue útil?

Solución

La segunda condición no será evaluado a menos que el primero ha sido evaluada como verdadera. Usted puede contar con esto. Millones de líneas de código, porque así es como C y C ++ hacer a corto curcuit evaluación expresiones lógicas.

Se puede utilizar y contar con ella. Si la primera expresión se evalúa como falsa la segunda ni siquiera start evaluación.

Otros consejos

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

No va a ser evaluado. Sin embargo, si está preocupado -en todo- que una rutina que el código va a volver a morder usted debe volver a evaluar lo que está escribiendo. Usted ha admitido que se trata de una práctica de programación. Usted ya sabe que va a ser un problema. Cuando se cumplen estas condiciones, simplemente fijar la cosa. Te odio a ti mismo menos por la mañana.

Las garantías lingüísticas de este breve comportamiento circuiting por lo que no debe preocuparse en absoluto por su uso. También funciona con || -. Si la primera condición es verdadera, el segundo no se evalúa

Basándose en corto el comportamiento cortocircuitos de la C ++ lógica AND y OR operadores no deben considerarse una mala práctica. Es perfectamente idiomática ya menudo conduce a código más claro y conciso.

por ejemplo.

std::auto_ptr< SomeObject > data;

Con && cortocircuitos:

// 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();
}

La segunda condición no será evaluado cuando la primera condición no es cierto. Como usted ha dicho, esta optimización es seguido por todos los compiladores de C ++.

Si usted todavía no puede ir con ella, añadir una sencilla sentencia if en el tiempo.

while ( a != b ) {
    if ( array[a] < c )
    {
         // your code goes here.
    }
    else
    {
        break;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top