Ja, ich habe den Artikel zu Sequenzpunkten gelesen. Allerdings konnte ich nicht verstehen, warum ++i = 2
undefiniertes Verhalten aufrufen würde? Der endgültige Wert von i
wäre 2 unabhängig von irgendetwas, also wie kommt der Ausdruck ub?
Codeausschnitt
%Vor%Tut mir leid, mein Englisch ist nicht sehr gut.
Sie beobachten , dass der Wert Ihr Anspruch ist, so kann sich UB unter anderen möglichen Szenarien manifestieren. Das Programm gibt möglicherweise aus, was Sie erwarten, gibt einige nicht verwandte Daten aus, stürzt ab, beschädigt Daten oder gibt Ihr ganzes Geld aus, um Pizza zu bestellen. Sobald der C ++ - Standard sagt, dass ein Konstrukt UB ist, sollten Sie kein spezifisches Verhalten erwarten. Beobachtete Ergebnisse können von Programm zu Programm variieren.
Es scheint für Sie offensichtlich, denn offensichtlich i
wird zuerst i+1
zugewiesen, dann Sekunde wird der Wert% zugewiesen co_de%.
Diese beiden Zuweisungen erfolgen jedoch innerhalb desselben Sequenzpunkts, daher liegt es an dem Compiler, welcher zuerst passiert und welcher zweite auftritt, daher können verschiedene Compiler-Implementierungen Code generieren, der andere Ergebnisse liefert, daher ist UB .
Das undefinierte Verhalten tritt auf, weil ein Compiler den folgenden Code implementieren könnte:
%Vor%entweder:
%Vor%oder
%Vor% Es ist in der Sprache nicht spezifiziert, ein Compiler könnte sich dafür entscheiden, beides zu implementieren. Der erste erzeugt 3
und der zweite 2
. Es ist also undefiniert.
Der Aufruf von ++i = 2;
ruft an und für sich kein undefiniertes Verhalten auf; Jeder Compiler kann, wenn er will, beim Erreichen dieses Codes eine sehr definierte Aktion ausführen. Der C ++ - Standard besagt jedoch, dass eine solche Operation nicht definiert ist. Daher kann ein Compiler etwas Unerwartetes tun (z. B. alle Dateien auf dem C-Laufwerk löschen oder eine Textnachricht an den Papst senden) und trotzdem ein kompatibler Compiler sein. Das einzige, was diese UB macht ist, dass der Standard sagt, dass es UB ist.
Vielleicht ist der wichtigste Punkt, dass eine Version eines Compilers etwas anderes als die nächste Version desselben Compilers tun kann.
Von genau demselben Link, den Sie bereitstellen:
- Außerdem muss der vorherige Wert sein nur zugegriffen, um den Wert zu bestimmen gespeichert werden.
Was bedeutet das? Es bedeutet, wenn ein Objekt wird in ein vollständiges geschrieben Ausdruck, alle und alle Zugriffe darauf innerhalb desselben Ausdrucks muss sein direkt an der Berechnung beteiligt des zu schreibenden Wertes.
Hier auf der linken Seite des Operators =
ist der Zugriff auf i
nicht an der Berechnung des geschriebenen Wertes beteiligt.
++ (sollte ein R-Wert sein und kann daher nicht als L-Wert verwendet werden, sondern (++ i) = 2; sollte gut funktionieren. Ich glaube nicht, dass dies UB ist, aber wie immer könnte ich mich irren.
Tags und Links c++