Ich weiß, dass etwas wie
schreibt %Vor%Ist nicht nur nicht lesbar, sondern verletzt auch die c / c ++ Sequenzpunkte.
Woher kommen diese Einschränkungen? Wie kann man diese "Probleme" sehen, bevor man sie als Bugs findet?
Grundsätzlich gibt es zwischen jeder Anweisung einen C ++ 03-Sequenzpunkt. Weitere Informationen finden Sie in der SO C ++ FAQ . Für weitere Informationen konsultieren Sie bitte den C ++ - Standard und beachten Sie, dass in der C ++ 11-Standardsequenz Punkte durch sequenziert vor und sequenziert nach Relationen ersetzt wurden.
Um Probleme zu vermeiden, versuchen Sie einfach nicht zu schlau zu sein, in jedem Ausdruck viel zu tun.
Versuchen Sie nicht, den Compiler-Job auszuführen: überlassen Sie das dem Compiler. Ihre Aufgabe ist es, Code zu schreiben, den andere Menschen leicht verstehen können, d. H. clear code . Mehrere Updates und unnötige Verwendung von Operatoren mit Nebenwirkungen ist damit nicht vereinbar.
Tipp: streuen Sie const
so gut wie überall.
Das beschränkt die möglichen Zustandsänderungen, die ein Leser berücksichtigen muss.
Sie stammen aus dem C- oder C ++ - Standard, der effektiv Sequenzpunkte auflistet. 1 In einigen einfachen Fällen kann Ihr Compiler Sie möglicherweise warnen, dass Sie nicht definiertes Verhalten aufrufen, aber nicht im allgemeinen Fall.
Sie verletzen jedoch in der Regel nur die Anforderungen an die Reihenfolge, wenn Sie "interessanten" Code wie Ihr Beispiel schreiben. Der Sprachstandard könnte besondere Beschränkungen für Code wie diesen auferlegen (was Sprachen wie Java tun), aber es gibt nicht viel Aufwärtspotenzial und den potenziellen Nachteil, bestimmte Arten der Optimierung zu verhindern.
1. Die Terminologie hat sich in C ++ 11 leicht geändert, aber das Prinzip ist immer noch weitgehend das gleiche, denke ich.
Wie kann man diese "Probleme" sehen, bevor sie als Fehler gefunden werden?
Kompilieren Sie Ihr Programm mit der strengsten Stufe und aktivieren Sie die Einstellungen für alle Warnungen als Fehler. Die meisten Mainstream-Compiler weisen aufgrund von Sequenzpunkten auf Undefined Behavior-Fehler hin.
Mit gcc können Sie verwenden:
%Vor% was auf Probleme mit dem Sequenzpunkt hinweist. Beachten Sie, dass es standardmäßig aktiviert ist, wenn Sie -Wall
verwenden.
Natürlich ist der beste Weg, mehr lesbaren Code zu schreiben, der den Sequenzpunkt mis-adventures vermeidet.
Tags und Links c c++ sequence-points