C99:我可以在'for'的块的开头声明变量吗?

时间:2009-12-10 12:42:25

标签: c c99 c89

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

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

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

C99 (PDF)

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

块允许将一组声明和语句分组到一个语法单元中。 具有自动存储持续时间和可变长度的对象的初始化程序 计算具有块作用域的普通标识符的数组声明符,并且值为 存储在对象中(包括在没有的对象中存储不确定的值) 初始化程序)每次按执行顺序达到声明时,就好像它是一个 语句,以及声明者出现的顺序中的每个声明。

来自该PDF的第145页。

4 个答案:

答案 0 :(得分:13)

这在C99和C89都是合法的。 请看6.8.2,它定义了复合语句

答案 1 :(得分:7)

是的,你可以在C99中的任何地方声明或定义一个变量(在C89的一个块的开头)。

你说:

  

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

即使之前已声明,也可以声明具有相同名称的 new 变量。这样做会阻止您访问该块中的旧变量。

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功能不是一个让我想要改变的功能:)

答案 2 :(得分:1)

是的,您可以在任何块的开头创建变量。每次输入块时都会初始化变量在C ++中,您可以在块中的任何位置创建它们。

答案 3 :(得分:1)

for(....)
{
  int x=4;
  /*More code*/
}

是的,这在C99中是合法的,但是你不允许在阻止之后访问'x'。这将是Undefined Behavior试图访问超出其范围的'x'。