[解決済み] Cエラーです。intの前に期待される式
2022-01-31 03:23:26
質問
以下のコードを試したところ、記載されているエラーが発生しました。
if(a==1)
int b =10;
しかし、以下は構文的に正しいです。
if(a==1)
{
int b = 10;
}
これはなぜでしょうか?
解決方法は?
これは実はかなり興味深い質問です。 最初に見たときほど単純ではありません。 参考までに、私は、以下のサイトで定義されている最新のC11言語文法をベースにするつもりです。 N1570
質問の反面教師は、これが正しければCということでしょうか。
if (a == 1) {
int b = 10;
}
では、なぜこれも正しいC言語ではないのでしょうか?
if (a == 1)
int b = 10;
つまり、1行の条件付き
if
は、中括弧を使っても使わなくてもどちらでもいいはずですよね?
その答えは
if
文は、C言語規格で定義されています。 その文法の該当箇所を以下に引用しておきます。 簡潔に言うと
int b = 10
行は
宣言
ではなく
ステートメント
の文法は
if
ステートメントでは、テストする条件の後にステートメントが必要です。 しかし、宣言を中括弧で囲むと、それは文になり、すべてがうまくいくのです。
そして、質問に完全に答えるために言っておきますが、これはスコープとは何の関係もありません。 その
b
変数はスコープの外からはアクセスできなくなりますが、プログラムは構文的に正しいのです。 厳密に言えば、コンパイラはこの件でエラーを出してはいけないのだ。 もちろん
-Wall -Werror
ということです。)
(6.7) 宣言 : declaration-specifiers init-declarator-list。 <サブ opt ; static_assert-declaration(スタティックアサート宣言 (6.7) init-declarator-list(イニット宣言者リスト : init-declarator。 init-declarator-list(イニット宣言者リスト , init-declarator。 (6.7) init-declarator。 : 宣言子 宣言者 = イニシャライザー (6.8) ステートメント : ラベル付きステートメント 複合文 expression-statement 選択文 繰り返し文 ジャンプステートメント (6.8.2) 複合ステートメント : { ブロックアイテムリスト <サブ オプト } (6.8.4) 選択文 : もし 表現 ) ステートメント もし 表現 ) ステートメント さもなくば ステートメント スイッチ( 表現 ) ステートメント
関連
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] 2次元配列の定義方法は?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】メタキャラクタの周りに空白が必要な場合があるのはなぜですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】strcmpが機能しない
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない