Credo che la risposta corretta a questa domanda è che il compilatore non (normalmente) ottimizzare valutazioni booleane, semplicemente a causa per logica corto circuito, per esempio:
if (GetFlagA() || GetFlagB())
{
...do something
}
L'ordine di che se la valutazione può davvero importa se chiamando GetFlagA modifica qualcosa che GetFlagB si basa su (concesso questo è pratica di codice davvero male, ma questo è un argomento diverso per un diverso thread.) Il problema qui è logico cortocircuito, se GetFlagA viene eseguito e restituisce true, Get FlagB non funzionerà mai, come visto qui il risultato di GetFlagB è irrilevante per la valutazione della dichiarazione.
A | B | =
F | F | F
F | T | T
T | F | T true indipendentemente dal valore di ritorno di B.
T | T | T true indipendentemente dal valore di ritorno di B.
Quindi, in sintesi, chiedere se è possibile ottimizzare utilizzando Demorgan o qualsiasi altra cosa è proprio come il resto dell'informatica e dell'ingegneria del software. "Dipende." se stai usando la valutazione non funzionale, probabilmente può essere ottimizzato. Onestamente, se stai parlando di alcune operazioni su una piattaforma follemente veloce, ti conviene passare il tempo a scrivere documentazione.
Spero che questo aiuti.
+1. Spesso de-ottimizzo i test booleani nel mio codice, in particolare per la leggibilità. – Cheeso
Compilatori? Inteligente? – Kekoa
Un compilatore non può ottimizzare la logica delle espressioni senza causare valutazioni in momenti diversi. Guarda la risposta di Firoso. Potrebbe essere abbastanza intelligente da sapere quando non è abbastanza intelligente però. – Kekoa