1. ホーム
  2. objective-c

[解決済み] switch文の中で変数を宣言する [重複]。

2022-09-04 06:05:19

質問

この問題に対するいくつかの回答を見ましたが、私はそれを理解しました。 switch . しかし、私は次のようにエラーをスローすることが正しいかどうか疑問に思っています。

error: 'int'の前に期待される表現

コードです。

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

なぜ NSLog() の前に置くとエラーにならないのはなぜですか?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}

どのように解決するのですか?

あなたは実際に ができます。 変数の宣言は、その言語の構文に従って行えば、スイッチ内で行うことができます。エラーになるのは、" case 0: はラベルであり、C言語では 宣言 をラベルの後の最初の文として持つことは違法です。 を期待することに注意してください(メソッド呼び出し、通常の代入など)。(奇妙かもしれませんが、これがルールなのです)。

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


編集します。

ところで、この癖はあなたが思うほど珍しいことではありません。CとJavaでは、ローカル変数の宣言を単独のステートメントとして(中括弧で囲まれていないことを意味します)使用することも違法です。 に対して , または する ループ、あるいは であれば でなければ という句があります。(のパズラー#55で取り上げています。 Java Puzzlers" で取り上げられています。) そもそも、このようなエラーは書かないのが普通だと思いますが、それは、このような文脈で唯一のステートメントとして変数を宣言することにほとんど意味がないからです。とは スイッチ / ケース という構文があるため、中括弧を省略する人もいます。 ブレーク 文は制御の流れにとって重要な文だからです。

コンパイラが発作を起こすのを見るには、この恐ろしくて無意味なスニペットをあなたの(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);

このような構成では常に { } 中括弧を使って本文を区切らなければならない理由がまた一つ増えました :-)