Está “corto circuito booleano” dictado por la norma o el programa usado solo en su mayoría como la optimización? [duplicar]

StackOverflow https://stackoverflow.com/questions/852676

Pregunta

Considere esto

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

En todos los compiladores que he trabajado, esto es bastante seguro. Es decir. la primera parte de la expresión booleana se evaluará como false , y la llamada al método () lo tanto, no ser intentado desde evaluando la segunda parte es redundante.

Es esto porque la mayoría de los compiladores de distancia optimizar la evaluación de la segunda parte, o es un comportamiento dictado de las normas C / C ++?

¿Fue útil?

Solución

Esto se llama boolean cortocircuito y se define a muchos idiomas. Aquí es un artículo de Wikipedia que describe qué idiomas tiene esta característica.

Ahora que ya sabe el nombre correcto de la función, no son otros de los artículos sobre él también.

Otros consejos

Expresión corto de corte está garantizada por la norma.

С ++ Standard 1998
Sección 5.14

  

Los grupos de operadores && izquierda a derecha.   Los operandos son tanto implícita   convertir al tipo bool (cláusula 4). los   resultado es verdadero si ambos operandos son   verdadero y falso en caso contrario. Diferente a &, &&   garantías de izquierda a derecha evaluación:   el segundo operando no se evalúa si   el primer operando es falso.

No he visto todavía mencionado, por lo que:

El cortocircuito está garantizada por C ++ excepto cuando se invoca el operador && o || está sobrecargado . Pero no hagas eso, porque es demasiado confuso.

Esta es una característica llamada cortocircuitos. Este comportamiento está garantizado por la norma de C ++. No creo que se trata de una optimización por así decirlo, pero es mucho más que simplemente una característica del lenguaje.

No se trata sólo de optimización, es útil para que pueda ser más conciso.

A medida que su ejemplo muestra, que le permite escribir una declaración eliminación de referencias "seguro" en una línea. De lo contrario, usted tiene que hacer algo como:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

parece trivial, pero trate de codificación en un lenguaje que no lo tienen (por ejemplo, Visual Basic 6) y se empieza a echar mucho de menos a él.

Está en los estándares del lenguaje como otras respuestas mencionan, pero sólo porque algo como esto tiene que estar claramente especificada. Que posiblemente puede compilar a código optimizado es un efecto secundario; En estos días, un C decente o compilador de C ++ compilarían las declaraciones de una línea o dos líneas equivilently

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top