1

根据 C99,以下代码是否合法?

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

您可以假设在第 3 行之前从未声明过变量 x。

C99 (PDF)

到目前为止,我只发现了以下内容,但我认为这还不够:

块允许将一组声明和语句组合成一个语法单元。具有自动存储持续时间的对象的初始化器和具有块范围的普通标识符的可变长度数组声明器在每次声明时被评估并将值存储在对象中(包括在没有初始化器的对象中存储不确定的值)按执行顺序到达,就好像它是一个语句,并且在每个声明中按照声明符出现的顺序。

从该 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 回答