23

特殊なケースが検出された場合にメイン関数から早期に戻るために、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 ステートメントを適切に機能させるにはどうすればよいですか? ありがとう!

4

3 に答える 3

28

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;
}
于 2013-03-06T02:06:25.830 に答える
3

キーワード「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;

}
于 2013-03-06T02:10:41.537 に答える
2

あなたは非常に重要なものを見逃しています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;
}

列挙定数と同じ名前の(未使用の)ラベルをいくつか作成しました(これがコンパイルされた理由です)。

于 2013-03-06T02:08:28.013 に答える