次のコードを試したときに、上記のエラーが表示されます。
if(a==1)
int b =10;
しかし、次は構文的に正しいです
if(a==1)
{
int b = 10;
}
どうしてこれなの?
これは実際にはかなり興味深い質問です。最初は見た目ほど簡単ではありません。参考のために、 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ステートメントスイッチ(表現)ステートメント
{ }
->
スコープを定義するので、if(a==1) { int b = 10; }
は、{}に対してint bを定義します-このスコープ。ために
if(a==1)
int b =10;
スコープはありません。また、b
はどこでも使用できません。