質問

    

この質問にはすでに回答があります:

         

この問題に対するいくつかの回答を見つけましたが、わかりました。 switch 内で変数を宣言して割り当てることはできません。しかし、私は次のようなエラーを投げるのに以下が正しいかどうか疑問に思っています

  

エラー: 'int'の前に式が必要です

コード:

switch (i) {
    case 0:
        int j = 1;
        break;
}

エラーが発生しない前に NSLog()を呼び出すのはなぜですか?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}
役に立ちましたか?

解決

言語の構文に応じてスイッチ内で変数を宣言すると、実際に 宣言できます。 " case 0:"が原因でエラーが発生しています。はラベルであり、Cでは、ラベルの後に最初のステートメントとして宣言を含めることは違法です—コンパイラーは、メソッド呼び出し、通常の割り当てなどのを予期することに注意してください(それがルールであるかもしれませんが、奇妙です)。

NSLog()を最初に置いたとき、この制限を回避しました。ケースの内容を{}中括弧で囲んでスコープブロックを導入するか、変数宣言をスイッチの外側に移動できます。どちらを選択するかは個人の好みの問題です。 {}中括弧で宣言された変数はそのスコープ内でのみ有効であることに注意してください。そのため、それを使用する他のコードもそれらの中括弧内に表示する必要があります。


編集:

ところで、この癖はあなたが思うほど珍しいことではありません。 CおよびJavaでは、 for while 、または do ループ、または if および else 句でループします。 (実際、これは" Java Puzzlers" のパズル#55でカバーされています。これを強くお勧めします。)通常、このようなコンテキストでは変数を唯一のステートメントとして宣言することはほとんど意味がないため、このようなエラーを最初から書くことはないと思います。ただし、 switch / case 構造では、 break ステートメントが制御フローの重要なステートメントであるため、中括弧を省略します。

コンパイラが適合をスローするのを見るには、この恐ろしく無意味なスニペットを(Objective-)Cコードにコピーします:

if (1)
    int i;
else
    int i;
for (int answer = 1; answer <= 42; answer ++)
    int i;
while (1)
    int i;
do
    int i;
while (1);

このような構成体の本体を区切るために常に{}中括弧を使用するもう1つの理由。 :-)

他のヒント

以前この問題に遭遇しましたが、結論はコードをブロック内に配置しただけでした。

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}

もう1つの簡単な回避策は、宣言の前に空の式(セミコロン)を追加することです。これにより、変数スコープをコードブロックに制限することを回避できます(または、コードブロックを使用するケースステートメントと使用しないケースステートメントを含む)。

switch (i) {
    case 0:;
        int j = 1;
        break;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top