こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2009-04-27 14:17:41

QNo.4913009

困ってます

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

> 前述した構文のように、クラスで定数宣言したものを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;
  }
}

投稿日時 - 2009-04-27 16:11:31

お礼

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

投稿日時 - 2009-04-27 16:28:05

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

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

投稿日時 - 2009-04-27 15:19:41

お礼

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

投稿日時 - 2009-04-27 15:40:41

ANo.2

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

投稿日時 - 2009-04-27 15:12:07

お礼

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

投稿日時 - 2009-04-27 15:31:35

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

投稿日時 - 2009-04-27 14:45:49

お礼

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

投稿日時 - 2009-04-27 15:12:06