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
> 前述した構文のように、クラスで定数宣言したものを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
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(4)
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
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