1. ホーム
  2. c

[解決済み] 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) 

選択文

:
            

もし


表現


)


ステートメント


もし


表現


)


ステートメント


さもなくば


ステートメント


スイッチ(


表現


)


ステートメント