[解決済み] switch文の中で変数を宣言する [重複]。
質問
この問題に対するいくつかの回答を見ましたが、私はそれを理解しました。
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);
このような構成では常に { } 中括弧を使って本文を区切らなければならない理由がまた一つ増えました :-)
関連
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] JavaScriptの変数のスコープとは何ですか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] switch文の複数ケース
-
[解決済み] JavaScriptで複数の変数を宣言する
-
[解決済み] このgdbの出力は何を意味しているのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] 現在の日付から7日分を差し引いた日数
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] Xcodeはクラッシュの原因となる行を表示しない
-
[解決済み] RootViewControllerのスイッチングアニメーション
-
[解決済み] Objective-CのクラスでSwiftのプロトコルをインポートする
-
[解決済み] NSPredicate: NSDateプロパティの日によるオブジェクトのフィルタリング
-
[解決済み] iOSの合成されたプロパティの名前を、先頭のアンダースコアで変更するのはなぜですか?重複
-
[解決済み] ARCで__autoreleasing ownership修飾子を記述する必要があるのは、どのような場合ですか?
-
[解決済み] なぜObjective-Cはプライベートメソッドをサポートしないのですか?