2017-05-06 5 views
0

私は種類、色をtheenumeratedています次の宣言の違いは?

enum colors {green, red, blue}; 

colors mycolors=redint yourcolors=redと同じであり、各列挙子intのタイプですか?両方とも1の値を持つでしょう、そうですか?

ありがとうございます!

+1

列挙型は、例えば、コンパイラのかもしれない(ただし、ゼロに近い狭い範囲でそれらを維持することは、コンパイラに、より最適化される可能性があり、(おそらくint型になりますが、小さいこともある)数字として実装されていますそれが助けてくれれば、彼らはチャーに詰め込むことができると決めました)。値は実際には内部的に同じですが、可能な限り列挙型を使用するほうが、基になる数値型を抽象化する方がよいでしょう。また、C++よりも他の関連言語が厳しいことに注意してください。 intとenumはC++では交換できますが、C#では(たとえ数値として格納されていても)交換することはできません。 –

+3

C++ 11でコーディングする場合は、単に 'enum class'を使用してください。 –

+3

'mycolors'の型は' colors'です。 'yourcolors'の型は' int'です。 –

答えて

2

は、私はちょうどジェイソン・ラングとKerrek SBのコメントを証明するために少しのコードスニペットを投稿したい:

#include <iostream> 
#include <typeinfo> 
enum colors {green, red, blue}; 

int main() 
{ 
    colors mycolors=red; 
    int yourcolors=red; 
    if (mycolors == yourcolors) 
     std::cout << "same values" << std::endl; 

    if (typeid(mycolors) != typeid(yourcolors)) 
     std::cout << "not the same types" << std::endl; 

    return 0; 
} 

次のコンソール出力につながるこのコードを実行:また

same values 
not the same types 

(Daniel Kamil Kozarが述べたように)enum class(C++ 11以降のみ!)があります。詳細についてはthis Questionを参照してください。をenumよりも優先させる理由については、

疑問「なぜだけでなくint S(またはlong秒または...)の後enum sがちょうど演算子のオーバーロードを考えているについて。つまり、++ colors(green) == 1は真であってはなりません。 this Questionオペレータのオーバーロードが平文enumおよびthis question and the accepted answerの場合、 'enumクラス'の演算子のオーバーロードを回避する方法を確認してください。

最後に、enumの使用は合理的であれば、コードの可読性が向上することに注意してください。

+0

まあ、ありがとう!しかし、 "mycolors == yourcolors"がtrueの場合、mycolorsの値はint(1)であり、これが真の場合、変数ではなくint型であることができます。 –

+0

これは、両方の変数が同じ値を持つことは、両方の変数が同じ型であることを意味するかもしれませんが、そうではありません。 '0.0 == 0.0f'と考えると、' double'は 'float'と同じではありません。 (おそらく最良の例ではないが、私は今より良いものを見つけることができないだろう) – Shadow

+0

@Game Ideas:IIはオペレータの過負荷を完全に忘れてしまった。私はそれについての段落を追加しました。 – Shadow

1
  • と思います。enumはもう少し型安全です。 int yourcolors=redはできますが、colors mycolors=1はできません。
  • 私はenumの使用状況をデバッグしています。その値の代わりに列挙名 が表示されます。
  • 列挙値は左辺値ではありません。したがって、を 参照で渡すと、スタティックメモリは使用されません。これはほぼ正確に、 が計算値をリテラルとして渡した場合と同じです。

enum KEYS 
{ 
    UP, 
    RIGHT, 
    DOWN, 
    LEFT 
}; 

void (KEYS select) 
{ 
    switch (select) 
    { 
     case UP: 
     case RIGHT: 
     case DOWN: 
     case LEFT: break; 
     default: exit(1); 
    } 
} 
+0

まあありがとう。したがって、これらの利点の状態では、enumまたはintのどちらを使用すべきかについては、読みやすく、コードをより効率的にすることが重要です。または私は間違っていますか? –

+0

私は例を追加しました。私はその読みやすさのために数字の代わりにラベルを見たいと思う。 – snr

関連する問題