根据C99,以下代码是否合法?
...
for(....) {
int x = 4;
...
}
...
您可以假设在第3行之前,变量x从未被声明。
到目前为止,我只发现了以下内容,但我认为这还不够:
块允许将一组声明和语句分组到一个语法单元中。 具有自动存储持续时间和可变长度的对象的初始化程序 计算具有块作用域的普通标识符的数组声明符,并且值为 存储在对象中(包括在没有的对象中存储不确定的值) 初始化程序)每次按执行顺序达到声明时,就好像它是一个 语句,以及声明者出现的顺序中的每个声明。
来自该PDF的第145页。
答案 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'。