Подтвердить что ты не робот

Использование типа перечисления в инструкции switch

Я использую оператор switch для возврата из моей основной функции раньше, если обнаружен какой-то особый случай. Специальные случаи кодируются с использованием типа перечисления, как показано ниже.

typedef enum {
    NEG_INF,
    ZERO,
    POS_INF,
    NOT_SPECIAL
} extrema;

int main(){

    // ...

    extrema check = POS_INF;

    switch(check){
        NEG_INF: printf("neg inf"); return 1;
        ZERO: printf("zero"); return 2;
        POS_INF: printf("pos inf"); return 3;
        default: printf("not special"); break;
    }

    // ...

    return 0;

}

Как ни странно, когда я запускаю это, строка not special печатается на консоль, а остальная часть основной функции выполняется с выполнением.

Как я могу заставить оператор switch правильно функционировать здесь? Спасибо!

4b9b3361

Ответ 1

Нет case. Теперь у вас есть метки goto. Попробуйте:

switch(check){
    case NEG_INF: printf("neg inf"); return 1;
    case ZERO: printf("zero"); return 2;
    case POS_INF: printf("pos inf"); return 3;
    default: printf("not special"); break;
}

Ответ 2

Вы не использовали ключевое слово "case". Версия, приведенная ниже, будет работать нормально.

typedef enum {
    NEG_INF,
    ZERO,
    POS_INF,
    NOT_SPECIAL

} extrema;

int main(){

    extrema check = POS_INF;

    switch(check){
        case NEG_INF: printf("neg inf"); return 1;
        case ZERO: printf("zero"); return 2;
        case POS_INF: printf("pos inf"); return 3;
        default: printf("not special"); break;
    }

    return 0;

}

Ответ 3

Вам не хватает важного case:

switch(check){
    case NEG_INF: printf("neg inf");     return 1;
    case ZERO:    printf("zero");        return 2;
    case POS_INF: printf("pos inf");     return 3;
    default:      printf("not special"); break;
}

Вы создали несколько (неиспользуемых) ярлыков с теми же именами, что и ваши константы перечисления (вот почему они скомпилированы).