Jeder Programmierer sollten wissen:De Morgan Gesetz Optimierung mit überladenen Operatoren
Unter bestimmten Umständen, um das Programm zu optimieren, kann es vorkommen, dass Compiler modifiziert (!p && !q)
Die beiden Ausdrücke sind gleichwertig, und es macht keinen Unterschied, ob die erste oder die erste Bewertung ausgewertet wird der Zweite.
Aber in C++ ist es möglich, Operatoren zu überlasten, und der überladene Operator kann diese Eigenschaft nicht immer respektieren. Wenn Sie also den Code auf diese Weise transformieren, wird der Code tatsächlich geändert.
Sollte der Compiler De Morgans Gesetze verwenden, wenn !
, ||
und &&
überladen sind?
Jeder vernünftiger Compiler Schriftsteller zu vertrauen vermeidet, dass der Programmierer korrekt den inversen Operator implementiert hat. Dies ist ein sehr häufiger Fehler. –
Im Allgemeinen kann der Compiler solche Transformationen nur dann auf Ihr Programm anwenden, wenn sie das beobachtbare Verhalten (Nebeneffekte, Ausgabe) Ihres Programms nicht verändern. Wenn 'p' und' q' boolesche Primitive sind, können De Morgans Gesetze angewendet werden, da das das beobachtbare Verhalten nicht ändert. Wenn "p" und "q" überladene Operatoren haben, kann dies wahr sein oder auch nicht. Der C++ - Standard sagt nichts über De Morgans Gesetze aus; Compiler dürfen nur "davon Gebrauch machen", weil sie wissen, dass sie ihr Verhalten nicht ändern werden. – davmac
natürlich nicht .... –