0

私はただ興味があります:次のようなswitchステートメントを取ります:

switch(myVar)
{
case(label):
    ...
    break;
}

ラベルをconstにする必要があるのはなぜですか?

4

4 に答える 4

4

Andy Prowlは、標準から関連する段落を提供しています。これが、そのようにしたいと思う理由の1つです。

考えてみてくださいswitch (c) { case a: ...; break; case b: ...; break; }。もしそうなら、あなたは何が起こるa==bb==c思いますか?

これをif ...; if ...またはif ...; else if ...で書くと、セマンティクスは明確になります。の場合、switchそれほど多くはありません。確かに、いずれかの方法で動作するように定義することはできますが、それを実行すると、動作がすぐには明確にならないコードになり、一般的には悪いことです。

于 2013-03-22T14:26:30.847 に答える
2

ラベルが一定でない場合、あいまいさを引き起こす可能性があります。

int a = 1, b = 6;

switch(myVar)
{

case a+1;
//etc
break;

case 2;
//etc
break;

}
于 2013-03-22T14:26:35.060 に答える
2

Cのaの背後にある全体的な考え方は、コンパイラがどの値がswitchどこに行くかを「準備」できるということです。myVarはい、それでもif-else-if-elseタイプの操作チェーンを使用することを選択できますが、特定の値を指定するmyVarと、結果は毎回同じになるはずです。もちろん、の式がlabel定数でない場合、コンパイル時に各値がどこに行くかを判別することはできません。

それがあなたの望むものでない場合は、コードで何か他のことをする必要があります-テーブルまたは多くのifステートメントが最も明白な解決策です。

于 2013-03-22T14:31:36.273 に答える
1

任意の定数式を使用できます。C ++ 11規格の6.4.2項によると:

条件は、整数型、列挙型、またはクラス型でなければなりません。クラス型の場合、条件は文脈上暗黙的に整数型または列挙型に変換されます(第4節)。統合プロモーションが実行されます。switchステートメント内のステートメントには、次のように1つ以上のケースラベルを付けることができます。

ケース定数式

ここで、定数式は、昇格されたタイプのスイッチ条件の変換された定数式(5.19)でなければなりません。同じスイッチ内の2つのケース定数は、昇格されたタイプのスイッチ条件に変換された後、同じ値を持つことはできません。

于 2013-03-22T14:23:25.357 に答える