Перечислить значение переменной по умолчанию? - PullRequest
55 голосов
/ 27 июля 2011

Вопрос прост:

#include <iostream>

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

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

Каким будет вывод?

Примечание: это не интервью, это код, унаследованный мной отпредыдущие разработчики.Оператор потоковой передачи здесь приведен только для примера, у фактического унаследованного кода его нет.

Ответы [ 2 ]

51 голосов
/ 27 июля 2011

Программа имеет Неопределенное поведение .Значение 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 
}

ДонНе удивляйтесь, что e может иметь значения, отличные от любых значений перечислителя SomeEnum.Каждый тип перечисления имеет базовый интегральный тип (например, int, short или long), а набор возможных значений объекта этого типа перечисления - это набор значений, которые имеет базовый интегральный тип.Enum - это просто способ удобно назвать некоторые значения и создать новый тип, но вы не ограничиваете значения вашего перечисления набором значений перечислителей.

Обновление: Некоторые цитаты, поддерживающие меня:

Инициализация объекта типа T с нуля означает:
- если T является скалярным типом (3.9), объектустановите значение 0 (ноль), преобразованное в T;

Обратите внимание, что перечисления являются скалярными типами.

Для инициализации значения объекта типа Tозначает:
- если T является типом класса бла-бла
- если T является типом класса без объединения, бла-бла
- если T является типом массива, то бла-бла - в противном случае объект равен нулю-инициализированный

Итак, мы попадаем в другую часть.И объекты области пространства имен инициализируются значением

0 голосов
/ 05 сентября 2013

Выход будет неопределенным. Переменные-члены enummy могут быть только 1 или 4.

...