2017-03-18 4 views
3

私は高校で勉強しましたが、私は組合の働きを理解するだけのプログラムを作っていましたが、予期しない結果をもたらしました。ユニオンでの予期しない結果(C++)

これは、プログラムした:

#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; 
} 

、次のように出力されました:

Volume :- 27 

私はこれが起こっている理由を理解したいと思います。

+4

私はあなたがもう一度労働組合が働く方法を検討するべきだと思います。 – skypjack

+0

なぜですか?何かエラーがあれば、教えてください – Fullatron

+1

あなたの期待は間違っています。組合のメンバーを*すべて*設定することはできません。このために構造体を使用します。組合のメンバーは排他的で、最初のものは**、もう2つは**を使用します。それはUBでしょうが、実際には、それらがすべてintであるという予測可能な結果を​​もたらします。とにかく、私が言ったように、あなたの期待は間違っていて、結果ではありません。 – skypjack

答えて

3

unionstructのように扱っているため、この問題が発生しています。

ユニオンは、の要素をすべて含むことができますが、はすべての要素を含むメモリ領域を割り当てます。あなたが書いたやり方では、同じアドレスを効果的に指す3つの名前があります。これは、割り当てに基づいて、割り当てられた領域に3を入れることを意味します。

つまり、これを書いた方法で、同じデータを参照する4つの方法を作成しただけです。

ユニオンを使用する方法の例は、2つ以上の代替構造を記述することです。例:

union Shape { 
    struct triangle { 
    int base; 
    int height; 
    } 
    struct rectangle { 
    int length; 
    int width; 
    } 
} 

これで、いずれの場合も1つのデータ型を使用できるようになりました。

+0

構造体がここでやったのと同じ仕事をしてくれるユニオンでプログラムを提供できますか? ? – Fullatron

+0

そして、実際に私はほとんどの場合構造体を使用しています...私は組合に慣れていません:P – Fullatron

+1

あなたは何をしようとしているのかについては組合を使用しません。 –

0

ユニオンは、同じメモリ位置に異なるデータ型を格納できる特殊なデータ型です。多くのメンバーを持つ共用体を定義できますが、一度に1つのメンバーしか値を入れることはできません。ユニオンは、多目的に同じメモリロケーションを使用する効率的な方法を提供します。

ユニオンタグはオプションであり、各メンバー定義は通常の変数定義です(int iなど)。またはフロートf。またはその他の有効な変数定義を使用します。ユニオンの定義の最後で、最後のセミコロンの前に、1つ以上の共用体変数を指定できますが、オプションです。ここでは、労働組合のデータは3人のメンバーI、Fを持つ名前付きの型、およびSTR定義する方法です - 今すぐ

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

は、データ型の変数は、整数、浮動小数点数、または文字列を格納することができます文字のこれは、単一の変数、すなわち同じメモリ位置を使用して、複数のタイプのデータを格納することができることを意味する。必要条件に基づいて、組み込みの内部またはユーザー定義のデータ型を使用することができます。

+0

今、私はそれを得ました...これは組合の限界と呼ぶことができますか? – Fullatron

+2

@Fullatron、これは*制限ではなく、むしろ*ユニオンの目的*です。このメモリ共有動作(99.99%の場合)をしたくない場合は、単に 'struct'または' class'を使うことができます。 –

+0

うーん、私はあなたが正しいと思う..しかし、これも使用を制限する... – Fullatron