Ungeordnete Funktionsbewertung für Funktionen, die void zurückgeben

8

Gibt es eine Möglichkeit in C und C ++, dass Funktionen, die void zurückgeben, in unspezifizierter Reihenfolge ausgewertet werden?

Ich weiß, dass Funktionsargumente in nicht spezifizierter Reihenfolge ausgewertet werden, sodass Funktionen, die nicht void zurückgeben, dazu verwendet werden können, diese Funktionen in nicht spezifizierter Reihenfolge auszuwerten:

%Vor%

Legaler C- und C ++ - Code, der von einem entsprechenden Compiler kompiliert wurde, kann hi , bye und moo in beliebiger Reihenfolge ausgeben. Dies ist nicht undefiniertes Verhalten ( nasale Dämonen wären nicht gültig ), es gibt einfach mehr als eine, aber weniger als unendlich gültige Ausgaben und ein kompatibler Compiler muss nicht einmal deterministisch sein was es produziert.

Gibt es eine Möglichkeit, dies ohne die Dummy-Rückgabewerte zu tun?

Erläuterung: Dies ist eine abstrakte Frage zu C und C ++. Eine bessere Originalformulierung könnte gewesen sein, gibt es einen Kontext, in dem die Funktionsbewertungsreihenfolge für Funktionen, die void zurückgeben, nicht spezifiziert ist? Ich versuche nicht, ein spezifisches Problem zu lösen.

    
Praxeolitic 03.12.2014, 04:37
quelle

2 Antworten

9

Sie können die Tatsache ausnutzen, dass die linke Seite eines Kommaoperators ein verworfener Wertausdruck ist ( void Ausdruck in C ) wie dieser ( es live sehen ):

%Vor%

Aus dem C ++ - Standardentwurfsabschnitt 5.18 Kommaoperator :

  

Ein durch Komma getrenntes Ausdruckspaar wird von links nach rechts ausgewertet; Der linke Ausdruck ist ein Ausdruck mit verworfenem Wert (Klausel 5).

und C11-Abschnitt 6.5.17 Komma-Operator :

  

Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; da ist ein   Sequenzpunkt zwischen seiner Auswertung und der des rechten Operanden. Dann das Richtige   Operand wird ausgewertet; Das Ergebnis hat seinen Typ und Wert.

Wie Matt hervorhebt, ist es auch möglich, die obige Methode mit arithmetischen Operatoren zu mischen, um eine nicht spezifizierte Reihenfolge der Auswertung zu erhalten:

%Vor%     
Shafik Yaghmour 03.12.2014, 04:55
quelle
-1

Nun, es gibt immer den offensichtlichen Ansatz, Zeiger auf die Funktionen in einem Container zu setzen, sie zu mischen (oder wie in einem Kommentar vorgeschlagen) und jedes Element im Container aufzurufen. Wenn Sie bei jedem Lauf das gleiche Verhalten haben müssen, stellen Sie sicher, dass Ihre Saat jedes Mal gleich ist.

    
Mark B 03.12.2014 04:41
quelle

Tags und Links