enumのintの比較 – プログラミング – Home

通知
すべてクリア

[解決済] enumのintの比較


ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

 お世話になります。VS2005 C++を作成しています。
enumについて質問があります。以下のようなenumおよび
コードを定義します

enum Test{
AAA =0,
BBB =1
};

void hoge( int para )
{
if( para == AAA ) // i )
printf(AAAです);
else if( para == BBB ) // ii )
printf(BBBです);
}

void main()
{
hoge(AAA); // enumの型でint引数の関数へ

}

上記の場合 以下の質問があります。

 ア)仮引数がint型のもの enumの型で渡すのことは安全なのでしょうか?キャストす
るべきですか?
  
 イ)i) ,ii)のように int型 と enum型 の比較は安全なのでしょうか?保証されな
いなどありますでしょうか?

 上記のコードは正常に動作しif文もきちんと判別しています。
私は enumの型の変数 = int型の変数 という認識ですが疑問になり質問させていた
だきました。ご教授よろしくお願いします


引用未解決
トピックタグ
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

すいません。タイトルがおかしいですね。

”enum型の変数とint型の変数比較について”

です 。ご迷惑おかけしました<(_ _)>


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

>  ア)仮引数がint型のもの enumの型で渡すのことは安全なのでしょうか?キャストす
> るべきですか?

それぞれのenum型,およびint型はすべて異なる型です。
つまり,オーバーロード可能ということになります。
なので,int型の引数にenum型の値を渡すことは予期せぬ動作の原因になり得ます。

よって,キャストすべきです。

>  イ)i) ,ii)のように int型 と enum型 の比較は安全なのでしょうか?保証されな
> いなどありますでしょうか?

整数型と列挙型の間で比較を行う場合,標準変換により列挙型が整数型に変換されるた
め,
その整数型の値と,列挙型の値を明示的に整数型にキャストした値との間の比較と同等の
比較結果は保証されます。
# これを安全と言うかどうかは安全の定義次第。


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
 

この場合は以下のようにできます。


void hoge( Test para )

enumのTest型を引数としてしまえば、
キャストする必要もなくなります。

また、VCではどのように設定するかはわかりませんが、
UNIX系のコンパイラ(gccなど)では、
-Wswitch-enumというコンパイラオプションをつけると

> if( para == AAA ) // i )
> printf(AAAです);
> else if( para == BBB ) // ii )
> printf(BBBです);


switch (para) {
cast AAA:
printf(AAAです);
break;

のようにswitch文にしたときに、
すべてのenumにたいしてcase文を書かないと
ワーニングが出るようになり、
プログラムミスが軽減できるかもしれません。


返信引用
ドルドル
 ドルドル
(@ドルドル)
ゲスト
結合: 19年前
投稿: 96
Topic starter  

YuOさん。シュウさん。ありがとうございます

>よって,キャストすべきです。
 ありがとうございます。今まで特に意識していなかったのですが enumとintを同じ型
と考えていたことがよろしくなかったみたいですね。

>すべてのenumにたいしてcase文を書かないとワーニングが出るようになり、
 私はUNIXはほとんど触ったことがありませんが、そのオプションは便利ですね。
VC2005でも設定できるんでしょうかね?調査してみます。

いろいろとありがとうございました。また何かありましたらよろしくお願いします


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました