2017-06-29 3 views
-5

Ich dachte, ich verstehe, wie Postfix und Prefix funktioniert, bis ich dieseVerhalten von Postfix und Prefix

begegnen
#include <iostream> 

using namespace std; 

int main(int argc, char const *argv[]) { 
    int a = 3, b = 3, c = 3; 
    cout << a + a++ << endl; // = 7 Okay, makes sense to me 
    cout << b + c++ << endl; // = 6 Now I'm confused 

    int x = 3, y = 3; 
    cout << (x++)*(x++)*(x++) << endl; // = 3*4*5 = 60 Okay I get it 
    cout << (++y)*(++y)*(++y) << endl; // = 5*5*6 = 150 Wait what ? But why... ? 
             // I thought it would be 4*5*6 or 6*6*6 or something 

    return 0; 
} 

Gibt es eine logische explaination dafür? Oder ist es ein unbestimmtes Verhalten?

Antwort

1

C++ bietet keine Garantien, welches Argument zuerst erstellt wird. Wenn Sie so etwas wie Code:

a + a++ 

es

int operator+(int a1, int a2) 

vor einem Aufruf von

übersetzt werden, um diese Funktion a2 und a1 berechnet werden müssen. Sie können nicht bestimmen, welcher Parameter zuerst ausgeführt wird. Also, Sie haben undefined Verhalten.

+0

Der Grund für die UB ist, dass es zwischen den Auswertungen keinen Sequenzpunkt gibt. Andernfalls wäre es ein unspezifisches Verhalten. – juanchopanza

+0

Ich bekomme es jetzt danke. Zu wissen, dass es in "int operator + (int a1, int a2)" übersetzt wird, hilft mir wirklich, meine Frage zu beantworten. –