2010-10-18 9 views
13

me gustaría saber si esto parece correcto:C: ¿hay una "evaluación diferida" cuando se usa el operador &&, como en C++?

while((next !=NULL) && (strcmp(next->name, some_string) < 0) { 
    //some process 
} 

Es decir, si el próximo es NULL, a continuación, la segunda parte de la expresión no será jamás probado por el compilador? He escuchado que en C++ es el caso (pero ni siquiera estoy seguro de eso).

¿Alguien puede confirmarme que no obtendré errores extraños en algunos compiladores con eso?

+4

@Sean: Las pruebas no son necesariamente iguales a "garantizadas por el estándar". –

+4

Por cierto, esto no siempre es cierto en C++. La expresión: '(next! = NULL)' puede usar un operador '! =' Sobrecargado en cualquier tipo 'next' is. Ese operador puede devolver otro tipo en el que '&&' está sobrecargado. Y para '&&' sobrecargado no existe un cortocircuito incorporado, por lo que la expresión en el RHS se evaluará independientemente del LHS. –

+1

Esto no es una evaluación perezosa – pmg

Respuesta

14

&& está cortocircuitado y lo está utilizando correctamente.
Si next es NULL, la comparación de cadenas nunca ocurrirá.

7

Es definitivamente el caso tanto en C como en C++.

+1

Corrección: Definitivamente es cierto en C, por lo que debería ser cierto en C++. – ruslik

+1

@ruslik - eso no es una corrección. C++ y C están cubiertos por estándares, y esta respuesta es correcta sobre lo que dicen ambos estándares (para tipos incorporados en C++) –

8

Sí, en C++ hay disponibles operadores de cortocircuito and y or.

Here se ha respondido una pregunta en la C-faq sobre el tema.

2

Esto funcionará con evaluación diferida (la segunda declaración no evaluada si la primera se evalúa como "falsa") a menos que el compilador sea tan no compatible con estándares que ni siquiera se pueda nombrar un compilador de C. Millones de líneas de código en el campo se basan en este comportamiento, por lo que puede pensar que este comportamiento está garantizado.

+0

se llama evaluación de cortocircuito, [evaluación diferida] (https://en.wikipedia.org/wiki/Lazy_evaluation) es otra cosa – sp2danny

Cuestiones relacionadas