He oído hablar del término "cortocircuito" que se usa en C, C ++, C #, Java y muchos otros. ¿Qué significa esto y en qué escenario se usaría?
concepts
conditions
if-statement
fasil
fuente
fuente
&&
operador.||
... al menos debería.||
y&&
para&
y|
ver la sutil diferencia. Haga que un programa simple evalúe1 || printf("yay");
vs0 || printf("yay");
y1 | printf("yay");
vs0 | printf("yay");
para ver las diferenciasRespuestas:
El cortocircuito en C es cuando un operador lógico no evalúa todos sus argumentos.
Tomemos por ejemplo y
&&
, es bastante obvio que0 && WhoCares
va a ser falso sin importar lo queWhoCares
sea. Debido a esto, C simplemente omite la evaluaciónWhoCares
. Lo mismo ocurre1 || WhoCares
, siempre será cierto. Debido a esto, podemos escribir código comoDe esta forma, evitamos realizar operaciones potencialmente imposibles. Si no podemos disparar los misiles, ciertamente no queremos intentarlo. Esto se usa comúnmente con punteros, especialmente punteros de archivo.
Esto se desarrolla de muchas otras formas útiles para evitar la computación innecesaria
Esto evita hacer un trabajo extra si no es necesario.
fuente
CanFireMissiles && FireMissiles()
, ya que me hace sospechar que estás abusando del cortocircuito para provocar efectos secundarios. Siento que estás ocultando acciones de manera condicional. Tal código está mejor escrito comoif(CanFireMissiles){FireMissiles();}
oif(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
.IsInCache(value) || IsInDatabase(value)
, por ejemplo , donde IsInDatabase puede tomar tiempo (especialmente si usar un dispositivo móvil y la latencia de la red es un problema)."Cortocircuito" generalmente se refiere a " Evaluación de cortocircuito ", que es un concepto general, no solo específico de C.
Evaluación de operadores booleanos de izquierda a derecha, por lo que cualquier término que haga innecesarios los otros términos es útil. Por lo tanto, puede verificar una condición que excluya otras condiciones más adelante, lo que permite una evaluación parcial de las operaciones lógicas en lugar de evaluar todo.
Ejemplo:
Un ejemplo más complejo:
fuente
== 0
no solo es innecesario, sino que puede confundir a algunas personas.La evaluación breve del ciruit puede llevar a que algunas partes de una condición no sean evaluadas.
Por ejemplo:
No se ejecutará
f
.fuente