web-dev-qa-db-ja.com

Cエラー:intの前に式が必要です

次のコードを試したときに、上記のエラーが表示されます。

if(a==1)
  int b =10;

しかし、次は構文的に正しいです

if(a==1)
{
   int b = 10;
}

どうしてこれなの?

33
MsPillai

これは実際にはかなり興味深い質問です。最初は見た目ほど簡単ではありません。参考のために、 N157 で定義されている最新のC11言語文法に基づいてこれを作成します。

質問の直感に反する部分は次のとおりだと思います:これが正しい場合C:

if (a == 1) {
  int b = 10;
}

なぜこれも正しいCではないのですか?

if (a == 1)
  int b = 10;

つまり、1行の条件付きifステートメントは、中かっこがあってもなくても問題ありません。

答えは、C標準で定義されているifステートメントの文法にあります。以下に引用した文法の関連部分。簡潔:int b = 10行は宣言であり、文ではありません、およびifステートメントの文法では、テストする条件の後にステートメントが必要です。しかし、宣言を中括弧で囲むと、ステートメントになり、すべてが順調になります。

そして、質問に完全に答えるためだけに-これはスコープとは関係ありません。そのスコープ内に存在するb変数は、その外部からはアクセスできませんが、プログラムは依然として構文的に正しいです。厳密に言えば、コンパイラーはエラーをスローすべきではありません。もちろん、-Wall -Werrorを使用してビルドする必要があります;-)

(6.7) 宣言:
 宣言指定子init-declarator-listopt;static_assert-declaration
 
(6.7) init-declarator-list:
 初期宣言子init-declarator-list初期宣言子
 
(6.7) 初期宣言子:
 宣言者宣言者=初期化子
 
(6.8) ステートメント:
 ラベル付き文複合文式文選択ステートメント繰り返し文ジャンプ文
 
(6.8.2) 複合文:
 {ブロック項目リストopt}
 
(6.8.4) 選択ステートメント:
 if(表現ステートメントif(表現ステートメントelseステートメントスイッチ(表現ステートメント
53
sheu

{ }->

スコープを定義するので、if(a==1) { int b = 10; }は、{}に対してint bを定義します-このスコープ。ために

if(a==1)
  int b =10;

スコープはありません。また、bはどこでも使用できません。

2
Pranit Kothari