1

次のコードはC99に従って合法ですか?

...
for(....) {
int x = 4;
...
}
...

3行目より前に、変数xが宣言されていなかったと想定できます。

C99(PDF)

今まで私は以下を見つけただけですが、これで十分だとは思いません:

ブロックを使用すると、一連の宣言とステートメントを1つの構文単位にグループ化できます。自動保存期間を持つオブジェクトの初期化子、およびブロックスコープを持つ通常の識別子の可変長配列宣言子が評価され、宣言が行われるたびに値がオブジェクトに保存されます(初期化子なしのオブジェクトに不確定な値を格納することを含む)それがステートメントであるかのように実行の順序で、そして宣​​言者が現れる順序で各宣言内に到達しました。

そのPDFの145ページから。

4

4 に答える 4

13

これはC99とC89の両方で合法です。複合ステートメントを定義する6.8.2を見てください。

于 2009-12-10T12:43:41.607 に答える
7

はい、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機能は、変更したくなる機能ではありません:)

于 2009-12-10T13:23:30.137 に答える
1

はい、任意のブロックの先頭に変数を作成できます。変数は、ブロックが入力されるたびに初期化されます。C++では、ブロック内の任意の場所に変数を作成できます。

于 2009-12-10T12:47:38.927 に答える
1
for(....)
{
  int x=4;
  /*More code*/
}

ええ、これはC99では合法ですが、ブロックの後に「x」にアクセスすることは許可されていません。その範囲を超えて「x」にアクセスしようとすると、未定義動作になります。

于 2009-12-10T12:50:04.183 に答える