私はただ興味があります:次のようなswitchステートメントを取ります:
switch(myVar)
{
case(label):
...
break;
}
ラベルをconstにする必要があるのはなぜですか?
私はただ興味があります:次のようなswitchステートメントを取ります:
switch(myVar)
{
case(label):
...
break;
}
ラベルをconstにする必要があるのはなぜですか?
Andy Prowlは、標準から関連する段落を提供しています。これが、そのようにしたいと思う理由の1つです。
考えてみてくださいswitch (c) { case a: ...; break; case b: ...; break; }
。もしそうなら、あなたは何が起こるa==b
とb==c
思いますか?
これをif ...; if ...
またはif ...; else if ...
で書くと、セマンティクスは明確になります。の場合、switch
それほど多くはありません。確かに、いずれかの方法で動作するように定義することはできますが、それを実行すると、動作がすぐには明確にならないコードになり、一般的には悪いことです。
ラベルが一定でない場合、あいまいさを引き起こす可能性があります。
int a = 1, b = 6;
switch(myVar)
{
case a+1;
//etc
break;
case 2;
//etc
break;
}
Cのaの背後にある全体的な考え方は、コンパイラがどの値がswitch
どこに行くかを「準備」できるということです。myVar
はい、それでもif-else-if-elseタイプの操作チェーンを使用することを選択できますが、特定の値を指定するmyVar
と、結果は毎回同じになるはずです。もちろん、の式がlabel
定数でない場合、コンパイル時に各値がどこに行くかを判別することはできません。
それがあなたの望むものでない場合は、コードで何か他のことをする必要があります-テーブルまたは多くのifステートメントが最も明白な解決策です。
任意の定数式を使用できます。C ++ 11規格の6.4.2項によると:
条件は、整数型、列挙型、またはクラス型でなければなりません。クラス型の場合、条件は文脈上暗黙的に整数型または列挙型に変換されます(第4節)。統合プロモーションが実行されます。switchステートメント内のステートメントには、次のように1つ以上のケースラベルを付けることができます。
ケース定数式:
ここで、定数式は、昇格されたタイプのスイッチ条件の変換された定数式(5.19)でなければなりません。同じスイッチ内の2つのケース定数は、昇格されたタイプのスイッチ条件に変換された後、同じ値を持つことはできません。