C ++ - Funktionsbewertungsreihenfolge im Zuweisungsoperator

8
%Vor%

Ich bin mir nicht sicher, welches zuerst ausgewertet werden sollte.

Ich habe in VC versucht, dass die Balkenfunktion zuerst ausgeführt wird. Im Compiler von g ++ (FreeBSD) gibt es jedoch die zuerst evaluierte foo-Funktion aus.

Eine interessante Frage ergibt sich aus dem obigen Problem, angenommen, ich habe ein dynamisches Array (std :: vector)

%Vor%

Basierend auf dem vorherigen Ergebnis wertet vc foobar () aus und führt dann den Vektoroperator [] aus. In diesem Fall ist das kein Problem. Da für gcc jedoch vec [0] ausgewertet wird und die Funktion foobar () dazu führt, dass der interne Zeiger des Arrays geändert wird. Der vec [0] kann nach der Ausführung von foobar () ungültig gemacht werden.

Bedeutet das, dass wir den Code so trennen müssen, dass

%Vor%     
Yiu Fai 28.11.2011, 11:33
quelle

3 Antworten

8

Die Reihenfolge der Bewertung wäre in diesem Fall nicht spezifiziert. Schreiben Sie keinen solchen Code

Ähnliches Beispiel hier

    
Prasoon Saurav 28.11.2011 11:35
quelle
5

Das Konzept in C ++, das bestimmt, ob die Reihenfolge der Auswertung definiert ist, wird als Sequenzpunkt bezeichnet.

Grundsätzlich ist es bei einem Sequenzpunkt garantiert, dass alle Ausdrücke vor diesem Punkt (mit beobachtbaren Nebenwirkungen) ausgewertet wurden und dass noch keine Ausdrücke über diesen Punkt hinaus ausgewertet wurden.

Obwohl manche es überraschend finden, ist der Zuweisungsoperator kein Sequenzpunkt. Eine vollständige Liste aller Sequenzpunkte finden Sie im Wikipedia-Artikel .

    
Martin B 28.11.2011 11:49
quelle
0

Die Reihenfolge der Auswertung eines Ausdrucks ist Nicht spezifiziertes Verhalten .
Es hängt vom Compiler ab, welche Reihenfolge er wählt.

Sie sollten davon absehen, Codes zu schreiben.
Wenn es jedoch keine Nebenwirkung gibt, sollte die Reihenfolge keine Rolle spielen.

Wenn die Reihenfolge zählt, ist Ihr Code falsch / Nicht portabel / kann zu unterschiedlichen Ergebnissen führen über verschiedene Compiler **.

    
Praveen 28.11.2011 11:40
quelle

Tags und Links