• ベストアンサー

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'の違いは何でしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.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;   } }

ShimantoGa
質問者

お礼

staticを使用した所、無事解決しました。 誠に有難う御座います。

その他の回答 (3)

  • oldman50
  • ベストアンサー率29% (8/27)
回答No.3

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; }

ShimantoGa
質問者

お礼

回答有り難う御座います。 /* case Data1: IntData = 3; break; */ のみ「整数型変数」(あるいは文字型変数)と解決され、コンパイルエラーとなる構文ということでよろしいですよね。 先ほど記載させて頂きましたが、クラスで定数宣言した際コンパイルエラーとなったため、違いについて疑問に思い質問させて頂いております。

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

case の値は《定数》でなければなりません。 コンパイル時にジャンプテーブルに展開される為だと思います。 ※このあたりアセンブラの常套手段ですし、もっと古い手続き型言語の ON GOTO の発展系と考えると理解し易いのではないかと思います。

ShimantoGa
質問者

お礼

回答有難う御座います。 メソッド内、あるいはメソッドの外で呼ばれる定数と、クラスで呼ばれる定数は展開される領域が違う。 前者はコンパイルで「定数」として解決が可能で、後者が解決不可能(インスタンス作成後に解決?)ということでしょうか。 申し訳ありませんが、アセンブラ以前には全く馴染みがありません。 前述した構文のように、クラスで定数宣言したものをswitch文で使用する方法はありますでしょうか。

noname#115727
noname#115727
回答No.1

変数と定数の違いだと思います。 なんでswitchの条件で変数が使えないのかはわかりません。。。すみません

ShimantoGa
質問者

お礼

回答有難う御座います。 確かに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は定数ではないのでしょうか。