- ベストアンサー
C++ Switch文について
int main(){ char Data1 = 'b'; char Data2 = 'b'; int IntData = 0; switch (Data2) { case Data1: IntData = 2; break; case'b': IntData = 3; break; } } と書くとコンパイルエラーで「整数型定数でなければいけません」と言われます。 case Data1: IntData = 2; break;をコメントアウトすると正常に動作します。 char Data1 = 'b';と、直書きの'b'の違いは何でしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 前述した構文のように、クラスで定数宣言したものをswitch文で使用する方法はありますでしょうか。 const staticにしてあげると、コンパイル時に定数を解決出来るので、 switch文で使えると思いますよ。 class Cls{ public: Cls(); const static char DATA1 = 'a'; }; //Cls::Cls():DATA1('a'){} Cls::Cls(){} int main(){ Cls ClacCls; //const char Data1 = 'a'; char Data2 = 'b'; int IntData = 0; switch (Data2) { //case Data1: IntData = 1; break; //case ClacCls.DATA1: IntData = 2; break; case Cls::DATA1: IntData = 2; break; case'b': IntData = 3; break; } }
その他の回答 (3)
- oldman50
- ベストアンサー率29% (8/27)
caseラベルは、整数型の定数式でなければならないからです。 #include <iostream> using namespace std; int main() { char Data1 = 'c'; const char Data1r = 'd'; const int ival = 3 + 'a' + ( 1 < 2 ); int IntData = 0; char ch; switch( ch ) { case 'b': IntData = 2; break; /* case Data1: IntData = 3; break; */ case Data1r: IntData = 4; break; case ival: IntData = 5; break; case ( 1 < 2 ): IntData = 6; break; } return 0; }
お礼
回答有り難う御座います。 /* case Data1: IntData = 3; break; */ のみ「整数型変数」(あるいは文字型変数)と解決され、コンパイルエラーとなる構文ということでよろしいですよね。 先ほど記載させて頂きましたが、クラスで定数宣言した際コンパイルエラーとなったため、違いについて疑問に思い質問させて頂いております。
- buriburi3
- ベストアンサー率44% (353/792)
case の値は《定数》でなければなりません。 コンパイル時にジャンプテーブルに展開される為だと思います。 ※このあたりアセンブラの常套手段ですし、もっと古い手続き型言語の ON GOTO の発展系と考えると理解し易いのではないかと思います。
お礼
回答有難う御座います。 メソッド内、あるいはメソッドの外で呼ばれる定数と、クラスで呼ばれる定数は展開される領域が違う。 前者はコンパイルで「定数」として解決が可能で、後者が解決不可能(インスタンス作成後に解決?)ということでしょうか。 申し訳ありませんが、アセンブラ以前には全く馴染みがありません。 前述した構文のように、クラスで定数宣言したものをswitch文で使用する方法はありますでしょうか。
変数と定数の違いだと思います。 なんでswitchの条件で変数が使えないのかはわかりません。。。すみません
お礼
回答有難う御座います。 確かにData1をconst宣言すれば実行可能なのですが、以下の場合も同様のエラーとなってしまします。 class Cls{ public: Cls(); const char DATA1; }; Cls::Cls():DATA1('a'){} int main(){ Cls ClacCls; //const char Data1 = 'a'; char Data2 = 'b'; int IntData = 0; switch (Data2) { //case Data1: IntData = 1; break; case ClacCls.DATA1: IntData = 2; break; case'b': IntData = 3; break; } } この場合DATA1は定数ではないのでしょうか。
お礼
staticを使用した所、無事解決しました。 誠に有難う御座います。