goto の後の変数宣言 Label
2023-10-12 18:55:49
質問
今日、一つ面白いことを発見しました。私は、gotoラベルの後に変数を宣言することができないことを知りませんでした。
以下のコードをコンパイルすると
#include <stdio.h>
int main() {
int x = 5;
goto JUMP;
printf("x is : %d\n",x);
JUMP:
int a = 0; <=== giving me all sorts of error..
printf("%d",a);
}
は以下のようなエラーを出します。
temp.c: In function ‘main’:
temp.c:7: error: expected expression before ‘int’
temp.c:8: error: ‘a’ undeclared (first use in this function)
temp.c:8: error: (Each undeclared identifier is reported only once
temp.c:8: error: for each function it appears in.)
さて、それはどういう理屈なのでしょうか?私は、次のように聞きました。 switchのcase文の中では変数を作れない。 . JUMPはgoto文と同じスコープ(私の場合はmain関数のスコープ)内にあるので、ここではスコープは問題ないと思います。しかし、それならなぜこのエラーが出るのでしょうか?
どのように解決するのですか?
構文がそれを許さないだけです。 §6.8.1 ラベル付きステートメント。
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
なお、"ラベル付き宣言"を許可する句はありません。 それは言語の一部ではないだけです。
もちろん、空のステートメントで、これを回避することは可能です。
JUMP:;
int a = 0;
関連
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
[解決済み] JavaScriptの変数をアンセットするには?
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み】定義と宣言の違いは何ですか?
-
[解決済み] C言語におけるエラー管理のためのgotoの有効な使用法?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
[解決済み] ラベルの後に初期化される変数がある場合、「ラベルは文の一部でしかなく、宣言は文ではありません」となるのはなぜですか?[重複しています]。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] C言語におけるエラー管理のためのgotoの有効な使用法?
-
[解決済み] Switch-caseが未使用行をコメントアウトした後にコンパイルされない