沒有初始化的C++枚舉類默認(rèn)值

沒有初始化的enum class變量的默認(rèn)值是多少?下面的代碼打印出奇怪的結(jié)果。

#include <iostream>
#include <cstdio>

using namespace std;

struct C {
    C() {
        m_a = 1;
    }

    enum class E:bool {
        a = false,
        b = true,
    };

    int m_a;
    E m_e;
};

int main()
{
    C c;
    cin >> c.m_a;
    printf("m_e: %d; compare to C::E::a: %d\n", static_cast<int>(c.m_e), c.m_e == C::E::a);
    return 0;
}

使用gcc版本9.4. 0 (Ubuntu 9.4.0-1ubuntu1~20.04. 1生成)

g++ -g -o c c.cpp
# run, input 1 and get the result.
./c
1
m_e: 252; compare to C::E::a: 253
# run c, input 2 and get the result.
./c
2
m_e: 254; compare to C::E::a: 255

Q1:為什么m_e未初始化為C::E::a(值false == 0?)或C::E::b(數(shù)值true == 1

問題2:為什么比較表達(dá)式c.m_e == C::E::a返回253/255,而不是false(值0)或true(數(shù)值1)?

? 最佳回答:

沒有初始化的枚舉類變量的默認(rèn)值是什么?

它是不確定的,因為您從未初始化過它。因此,從c.m_e讀取將使您的程序具有未定義的行為,并且程序可能只顯示任何值-或者沒有值并崩潰(或者更糟)。

E m_e;更改為

E m_e{};

它將被初始化為零,這在您的情況下意味著false

注意:如果0實際上不是一個定義的枚舉數(shù)的值,則初始化enum class的零可能會導(dǎo)致結(jié)果混亂。盡管如此,它還是會對enum class的基類型進行零初始化。

最好是明確的:

E m_e{E::a};

Q1:為什么m_e未初始化為C::E::a(值false == 0?)或C::E::b(數(shù)值true == 1

因為,它沒有被初始化,任何東西都可能出現(xiàn)——或者根本不出現(xiàn)。

Q2:為什么比較表達(dá)式c.m_e == C::E::a返回253/255,而不是false(值0)或true(數(shù)值1)?

再一次程序的行為未定義。

注意:在當(dāng)前的MSVC中,當(dāng)您執(zhí)行cin >> c.m_a;并稍后打印c.m_e的值時,它將顯示您在c.m_a中輸入的值。奇怪的不,這只是未定義行為可能出現(xiàn)的一種方式。

主站蜘蛛池模板: 亚洲欧洲专线一区| 国产午夜精品一区理论片| 久久一区二区免费播放| 亚洲蜜芽在线精品一区| 亚洲av区一区二区三| 伊人色综合视频一区二区三区| 视频在线一区二区| 国产一区二区精品久久91| 成人无号精品一区二区三区| 国产精品无码一区二区在线观 | 在线观看日韩一区| 国产激情一区二区三区小说| 国产亚洲欧洲Aⅴ综合一区| 国产精品视频无圣光一区| 2021国产精品一区二区在线| 99国产精品一区二区| 国产一区二区精品久久91| 亚洲AV成人一区二区三区观看| 国产精品视频一区麻豆| 夜夜高潮夜夜爽夜夜爱爱一区| 国产精品一区二区无线| 欧美激情一区二区三区成人| 国产对白精品刺激一区二区| 精品日韩亚洲AV无码一区二区三区| 熟妇人妻系列av无码一区二区| 国产成人久久精品麻豆一区| 99精品国产高清一区二区三区 | 在线精品视频一区二区| 91国在线啪精品一区| 国产激情一区二区三区在线观看 | 免费萌白酱国产一区二区| 亚洲AV无码一区二区大桥未久| 97精品国产一区二区三区| 天堂Av无码Av一区二区三区| 国产香蕉一区二区三区在线视频 | 人妻少妇精品视频三区二区一区 | 国产精品视频第一区二区三区| 亚洲一区二区三区影院 | 国产成人精品一区二区秒拍 | 亚洲av综合av一区二区三区| 国内精品一区二区三区东京|