web-dev-qa-db-ja.com

列挙型変数のデフォルト値?

質問は簡単です:

#include <iostream>

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4
};

int main() {
    SomeEnum enummy;
    std::cout << (int)enummy;
}

出力は何になりますか?

注:これはnotインタビューであり、これは以前の開発者から私が継承したコードです。ここでのストリーミング演算子は、たとえば、実際の継承されたコードにはありません。

55
Haspemulator

プログラムには 未定義の動作 があります。 enummyの値は不定です。概念的には、コードと次のコードに違いはありません。

int main() {
   int i;          //indeterminate value
   std::cout << i; //undefined behavior
};

名前空間スコープで変数を定義した場合、値は0に初期化されます。

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4,  
};
SomeEnum e; // e is 0
int i;      // i is 0

int main()
{
    cout << e << " " << i; //prints 0 0 
}

eSomeEnumの列挙値と異なる値を持つ可能性があることに驚かないでください。各列挙型には、基礎となる整数型(intshortlongなど)があり、その列挙型のオブジェクトの可能な値のセットは、基になる整数型が持つ値。 Enumは、いくつかの値に便利な名前を付けて新しい型を作成するための単なる方法ですが、列挙子の値のセットによって列挙値を制限することはありません。

更新:

タイプTのオブジェクトをゼロで初期化するとは、次のことを意味します。
— Tがスカラー型(3.9)の場合、オブジェクトはTに変換された0(ゼロ)の値に設定されます。

列挙はスカラー型であることに注意してください。

タイプTのオブジェクトの値を初期化するには、次のことを意味します。
— Tがクラスタイプである場合
— Tが非ユニオンクラスタイプである場合
— Tが配列型の場合、何とか—それ以外の場合、オブジェクトはゼロで初期化されます

それで、そうでなければ一部に入ります。また、名前空間スコープオブジェクトは値で初期化されます

51
Armen Tsirunyan

出力は不定になります。 enummyメンバー変数は1または4のみです。

0
primeFactor