10

atype の変数に間違った値を代入しようとしても、コンパイラが文句を言わないのはなぜenum answerですか?

#include <stdio.h>

int main()
{
    enum answer {NO, YES};
    enum gender {MALE, FEMALE};

    enum answer a = 5; /* Assign an invalid value. */
    printf("answer: %d\n", a);

    a = MALE; /* Assign a value of wrong type */
    printf("answer: %d\n", a);

    return 0;
}

出力は次のとおりです。

$ gcc -std=c99 -pedantic -Wall -Wextra enum.c 
$ ./a.out
answer: 5
answer: 0

enum型チェックにつながらない場合、構文を次のようにする意味は何ですか。

enum [identifier] {enumerator-list}

列挙型の識別子としてanswerandを使用しました。genderこの構文を許可するポイントは何ですか?

つまり、このコードは次のように非常にうまく記述できます。

enum {NO, YES};
enum {MALE, FEMALE};

この構文を許可するポイントは何ですか?

enum answer {NO, YES};
enum gender {MALE, FEMALE};
4

3 に答える 3

7

aタイプの変数に誤った値を割り当てようとすると、コンパイラが文句を言わないのはなぜenum answerですか?

Cでは、anenumは実質的に。と同等であるためintです。それはそれのように標準化されており、単にあまりにも多くのプログラムがそれを変更するためにその振る舞いに依存しています。

C ++では、これらは別個の型であり、コンパイラーは次のように文句を言います。

$ g++ -Wall -Wextra a.c
a.c: In function 'int main()':
a.c:8:24: error: invalid conversion from 'int' to 'main()::answer' [-fpermissive]
a.c:11:14: error: cannot convert 'main()::gender' to 'main()::answer' in assignment

この構文を許可する意味は何ですか?

私の簡単な推測は、上位互換性です。

于 2012-08-12T15:13:00.530 に答える
4

enumerationC は値を整数として直接公開しますが、C++enum実数型です。したがって、C++ では型チェックenumが行われますが、 C ではenum は単に int 型の定数を表します。したがって、すべての算術演算で整数値と列挙値を混在させることができます。

于 2012-08-12T15:19:47.767 に答える
0

仮定:

enum answer {NO, YES};

enum gender {MALE, FEMALE};

と:

enum answer bla = YES; 
enum gender blop = MALE;
int bip = 0;

C 標準では必須ではありませんが、以下の場合に実装が警告できるようにします。

bla = blop;

bip =  bla;

enum型は算術型であり、異なる算術型のオブジェクト間の代入は常に許可されますが、実装は依然として自由に警告できることに注意してください。enum一部のコメントで述べたように、 C++ では型に関する規則が異なります。

編集:別の例:

enum ans {
    YES,
    NO,
    MAYBE
};


enum ans a = /* initializer */;

switch (a)
{
    case YES:
        break;
    case NO:
        break;
}

-Wall(つまり-Wswitch) を 使用すると、次のgccことを警告できます。

tst.c:15:5: 警告: 列挙値 'MAYBE' はスイッチで処理されません

あなたが持っていた場合:

enum {
    YES,
    NO,
    MAYBE
};

int a = /* initializer */;

gcc警告することはできません。enumしたがって、定数だけではなく実際に型を使用すると、enum静的アナライザー ツールが役立ちます。

于 2012-08-12T16:56:07.860 に答える