2017-03-18 3 views
3

Ich studiere in der High School und ich machte ein Programm, nur um zu verstehen, wie eine Union funktioniert, aber das Programm gibt mir unerwartete Ergebnisse.Unerwartetes Ergebnis in Union (C++)

Das war das Programm:

#include <iostream> 
using namespace std; 

union c{ 
    int l; 
    int b; 
    int h; 
    int vol; 
}; 

int main() { 
    c box; 
    box.l=1; 
    box.b=2; 
    box.h=3; 

    box.vol = box.l*box.b*box.h; 

    cout<<"\n Volume :- "<<box.vol; 
    return 0; 
} 

Und die Ausgabe wie folgt dar:

Volume :- 27 

ich verstehen will, warum dies geschieht.

+4

Ich denke, Sie sollten darüber nachdenken, wie Gewerkschaften noch einmal arbeiten. – skypjack

+0

warum? Wenn es einen Fehler gibt, bitte sagen Sie mir – Fullatron

+1

Ihre Erwartung ist falsch. Sie können * all * die Mitglieder einer Gewerkschaft nicht festlegen und erwarten, dass sie ihre Werte behalten. Verwenden Sie eine Struktur dafür. Mitglieder einer Gewerkschaft sind (sagen wir mal) exklusiv, Sie benutzen entweder die erste ** oder ** die zweite und so weiter. Es wäre ein UB, aber für die Tatsache, dass es Ihnen ein vorhersagbares Ergebnis gibt, wenn Sie alle "int" sind. Wie auch immer, wie gesagt, deine Erwartung ist falsch, nicht das Ergebnis. – skypjack

Antwort

3

Sie haben dieses Problem, weil Sie eine union behandeln, als wäre es eine struct.

Eine Union weist einen Speicherraum, der jede der Elemente aber nicht alle von ihnen enthalten. In der Art, wie Sie es geschrieben haben, gibt es drei Namen, die effektiv auf die gleiche Adresse zeigen. Dies bedeutet, dass Sie basierend auf den Zuweisungen eine 3 in den zugewiesenen Speicherplatz eingeben.

Mit anderen Worten, die Art und Weise, dass Sie dies geschrieben haben, haben Sie einfach vier Möglichkeiten der Referenzierung der gleichen Daten erstellt.

Ein Beispiel für die Verwendung einer Union wäre die Beschreibung von zwei oder mehr alternativen Strukturen. Zum Beispiel:

Sie können jetzt einen einzelnen Datentyp für beide Fälle verwenden.

+0

So können Sie mir ein Programm mit Union, die die gleiche Arbeit wie eine Struktur getan hätte hier tun ? – Fullatron

+0

Und tatsächlich benutze ich Struktur in den meisten Fällen ... ich bin nicht zu den Gewerkschaften gewöhnt: P – Fullatron

+1

Sie würden keine Vereinigung für das verwenden, was Sie versuchen zu tun. –

0

Eine Union ist ein spezieller Datentyp, der in C verfügbar ist. Er ermöglicht das Speichern verschiedener Datentypen an demselben Speicherort. Sie können eine Union mit vielen Mitgliedern definieren, aber nur ein Mitglied kann zu jeder Zeit einen Wert enthalten. Unionen bieten eine effiziente Möglichkeit, den gleichen Speicherort für mehrere Zwecke zu verwenden.

Das Union-Tag ist optional und jede Elementdefinition ist eine normale Variablendefinition, z. B. int i; oder float f; oder irgendeine andere gültige Variablendefinition. Am Ende der Union-Definition können Sie vor dem letzten Semikolon eine oder mehrere Union-Variablen angeben, dies ist jedoch optional. Hier ist die Art und Weisen Sie einen Union-Typen definieren würden namens Daten mit drei Mitgliedern i, f und str -

union Data { 
    int i; 
    float f; 
    char str[20]; 
} data; 

nun eine Variable vom Datentyp eine ganze Zahl speichern kann, eine Fließkommazahl oder eine Zeichenfolge von Charakteren. Es bedeutet, dass eine einzelne Variable, d. H. Dieselbe Speicherstelle, verwendet werden kann, um mehrere Arten von Daten zu speichern. Sie können beliebige integrierte oder benutzerdefinierte Datentypen innerhalb einer Union basierend auf Ihren Anforderungen verwenden.

+0

Oh, jetzt habe ich es ... kann das eine Einschränkung der Union genannt werden? – Fullatron

+2

@Fullatron, das ist * keine * Beschränkung, sondern eher * der Zweck * von 'Union'. Sie können einfach 'struct' oder' class' verwenden, wenn Sie dieses Speicherfreigabeverhalten nicht möchten (was 99,99% Fälle sind). –

+0

Hmm ich denke, du hast Recht .. Aber das begrenzt auch die Verwendung ... – Fullatron