Está “corto circuito booleano” dictado por la norma o el programa usado solo en su mayoría como la optimización? [duplicar]
-
21-08-2019 - |
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 ++?
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