2017-03-13 2 views
0

Kann jemand erklären, warum dieser Code den Ausgang 10 gibt? Wenn ich versuche, es zu analysieren meine Logik gibt als Ergebnis 11.Struktur und Funktionen in C++

#include <iostream> 
using namespace std; 
class A { 
public:  
    A() { a.a = a.b = 1; } 
    struct { int a,b; } a; 
    int b(void); 
}; 

int A::b(void) { 
    int x=a.a; 
    a.a=a.b; 
    a.b=x; 
    return x; 
}; 

int main(void) {  
    A a; 
    a.a.a = 0; 
    a.b(); 
    cout << a.b() << a.a.b << endl; 
    return 0; 
} 
+2

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+3

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+2

Vielleicht lesen Sie über [Sequenzpunkte] (https://en.wikipedia.org/wiki/Sequence_point). – paddy

Antwort

2

In der cout Linie, a.b() könnte entweder vor oder nach aufgerufen werden a.a.b ausgewertet wird. Anfänger gehen manchmal von links nach rechts in diese Art von Code ein, aber das ist eigentlich keine Regel von C++. Diese zwei verschiedenen Möglichkeiten würden Ihre 10 und 11 erklären. Um Unklarheiten zu vermeiden, könnten Sie schreiben:

cout << a.b(); 
cout << a.a.b << endl; 

(vorausgesetzt, dass Reihenfolge war Ihre Absicht).

Hinweis: C++ 17 may change this und definieren Sie die Links-Rechts-Bewertungsreihenfolge für diesen Code.

0

Neben der Verwendung eines Debuggers können Sie auch cout Anweisungen verwenden, um zu verfolgen, wann die Dinge aufgerufen werden.

Um mich Art zu helfen, Ihr Programm, das ich ein wenig von der Vertiefung fixiert Verfolgung und Kommentare hinzugefügt, wann Dinge geschehen:

#include <iostream> 
using namespace std; 
class A { 
public: 
    A() { 
     a.a = a.b = 1; 
    } 
    struct { 
     int a,b; 
    } a; 
    int b(void); 
}; 

int A::b(void) { 
    cout << "Within A::b()" << endl; 
    // swap a.a, a.b 
    int x=a.a; 
    a.a=a.b; 
    a.b=x; 

    cout << "a.a.a = " << a.a << " a.a.b: " << a.b << endl; 

    return x; 
}; 

int main(void) { 
    // sets a.a.a = 1, a.a.b = 1 
    A a; 
    // sets a.a.a = 0, a.a.b = 1 
    a.a.a = 0; 
    // a.a.a = 1, a.a.b = 0 
    a.b(); 
    // check output here 
    cout << a.b() << a.a.b << endl; 
    return 0; 
} 

Die obigen Programmergebnisse mit der folgenden Ausgabe auf http://cpp.sh/:

Insgesamt hängt es davon ab, ob ab() oder aab zuerst aufgelöst wird, wenn Sie cout aufrufen. In diesem Fall ist die Operatorpriorität aufgrund der Funktionsweise von cout nicht definiert. This stackoverflow post hat einige gute Infos dazu.

+0

Danke, dass Sie sich die Zeit genommen und Ihre Kommentare dem Code hinzugefügt haben. .. Ich schätze es wirklich und es war sehr hilfreich ... danke Joe – Monch