c++ - traductor - unless oraciones
¿Hay alguna razón para usar if(1 ||! Foo())? (4)
La pregunta se contestó correctamente: la diferencia es que el lado derecho de la operación está cortocircuitado, lo que sugiere que se trata de un código de depuración para forzar la entrada al bloque if.
Pero, en aras de las mejores prácticas, al menos mi puñalada en la mejor práctica, sugeriría alternativas, en orden de preferencia creciente (la mejor es la última):
Nota: notado después de que codifiqué ejemplos esta era una pregunta de C ++, los ejemplos son C #. Espero que puedas traducir. Si alguien me necesita, solo publique un comentario.
Comentario en línea:
if (1 /*condition*/) //temporary debug
Comentario fuera de línea:
//if(condition)
if(true) //temporary debug
Nombre-Función Indicativa
//in some general-use container
bool ForceConditionForDebug(bool forcedResult, string IgnoredResult)
{
#if DEBUG
Debug.WriteLine(
string.Format(
"Conditional {0} forced to {1} for debug purposes",
IgnoredResult,
forcedResult));
return forcedResult;
#else
#if ALLOW_DEBUG_CODE_IN_RELEASE
return forcedResult;
#else
throw new ApplicationException("Debug code detected in release mode");
#endif
#endif
}
//Where used
if(ForceConditionForDebug(true, "condition"))...
//Our case
if(ForceConditionForDebug(true, "!Foo()"))...
Y si quería una solución realmente robusta, podría agregar una regla de repositorio al control de origen para rechazar cualquier código ingresado que llame a ForceConditionForDebug. Este código nunca debería haber sido escrito de esa manera porque obviamente no comunica intenciones. Nunca debería haberse registrado (o se le ha permitido registrarse) (¿control de fuente? ¿Revisión por pares?) Y definitivamente nunca se debe permitir que se ejecute en producción en su forma actual.
Leí un código heredado:
if ( 1 || !Foo() )
¿Hay alguna razón por la que no se escribe?
if ( !Foo() )
Los dos no son lo mismo. El primero nunca evaluará Foo()
porque el 1
cortocircuita el ||
.
¿Por qué está hecho? Probablemente alguien quería forzar la entrada en la sucursal de then
con fines de depuración y lo dejó allí. También podría ser que esto se escribió antes del control de fuente, por lo que no querían que el código se perdiera, sino que simplemente se pasa por alto por el momento .
if (1 || !Foo() )
siempre estará satisfecho. !Foo()
ni siquiera se alcanzará debido a la evaluación de cortocircuitos .
Esto sucede cuando desea asegurarse de que se ejecutará el código debajo de if
, pero no desea eliminar la condición real en él, probablemente con fines de depuración.
Información adicional que podría ayudarlo:
-
if(a && b)
- sia
esfalse
,b
no se marcará. -
if(a && b)
- sia
estrue
,b
será verificado, porque si esfalse
, la expresión seráfalse
. -
if(a || b)
- sia
estrue
,b
no se verificará, porque de todos modos estrue
. -
if(a || b)
- sia
esfalse
,b
será verificado, porque sib
estrue
entonces serátrue
.
Se recomienda encarecidamente tener una macro para este fin, digamos DEBUG_ON 1
, que hará que sea más fácil entender lo que significa el programador, y no tener números mágicos en el código (Gracias @grigeshchauhan).
1 || condition
siempre es cierto, independientemente de si la condition
es verdadera o no. En este caso, la condition
nunca se está evaluando. El siguiente código:
int c = 5;
if (1 || c++){}
printf("%d", c);
salidas 5
ya que c
nunca se incrementa, sin embargo, si cambia de 1
a 0
, se llamará realmente a c++
, haciendo que la salida 6
.
Un uso práctico habitual de esto es la situación en la que desea probar algún fragmento de código que se invoca cuando la condición que se evalúa como verdadera solo se cumple pocas veces:
if (1 || condition ) {
// code I want to test
}
De esta manera, la condition
nunca se evaluará y, por lo tanto, // code I want to test
siempre se invoca. Sin embargo, definitivamente no es lo mismo que:
if (condition) { ...
que es un enunciado en el que se evaluará realmente la condition
(y en su caso se llamará a Foo
)