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

qui*_*lby 1 c c99 c89

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

...
for(....) {
int x = 4;
...
}
...
Run Code Online (Sandbox Code Playgroud)

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

C99(PDF)

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

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

从该PDF的第145页开始.

nos*_*nos 13

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


pmg*_*pmg 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 */
Run Code Online (Sandbox Code Playgroud)

我从未尝试过C99中的以下内容.我真的不知道会发生什么:)
我稍后会尝试访问(几乎)C99编译器

int x = 0;
do {
    printf("%d\n", x);   /* old x? new x? crash? Undefined Behaviour? */
    int x = 42;
} while (0);
Run Code Online (Sandbox Code Playgroud)

在任何人想要的地方声明/定义变量的C99功能不是一个让我想要改变的功能:)