質問
C99によると、次のコードは合法ですか?
...
for(....) {
int x = 4;
...
}
...
3行目の前に変数xが宣言されなかったと仮定できます。
今まで私は次のものしか見つけていませんが、これで十分だとは思わない:
ブロックを使用すると、一連の宣言とステートメントを1つの構文ユニットにグループ化できます。自動ストレージ期間を持つオブジェクトの初期化剤、およびブロックスコープのある通常の識別子の可変長アレイ宣言者が評価され、値はオブジェクトに(初期イザーなしではオブジェクトに不定値を保存することを含む)宣言が宣言されるたびにあります。実行の順序で、まるでそれが声明であるかのように、および宣言者が現れるという順序で各宣言の中で到達しました。
そのPDFの145ページから。
解決
はい、C99で必要な場所(C89のブロックの開始時)に変数を宣言または定義できます。
あなたが言った:
「3行目の前に変数xが宣言されなかったと想定できます。」
以前に宣言されたとしても、 新着 同じ名前の変数。それを行うと、そのブロック内の古い変数にアクセスすることができなくなります。
int x = 0; /* old x */
printf("%d\n", x); /* old x, prints 0 */
do {
int x = 42; /* new x */
printf("%d\n", x); /* new x, prints 42 */
} while (0);
printf("%d\n", x); /* old x, prints 0 */
C99で以下を試したことはありません。何が起こるのか本当にわかりません:)
(ほぼ)C99コンパイラにアクセスできるようになったら、後で試してみます
int x = 0;
do {
printf("%d\n", x); /* old x? new x? crash? Undefined Behaviour? */
int x = 42;
} while (0);
必要な場所に変数を宣言/定義するC99機能は、私が変えたくなる機能ではありません:)
他のヒント
これは、C99とC89の両方で合法です。複合ステートメントを定義する6.8.2を見てください
はい、ブロックの先頭に変数を作成できます。変数は、ブロックがC ++で入力されるたびに初期化され、ブロック内のどこにでも作成できます。
for(....)
{
int x=4;
/*More code*/
}
ええ、これはC99では合法ですが、ブロックの後に「X」にアクセスすることは許可されていません。それは、その範囲を超えて「X」にアクセスしようとする未定義の動作になります。