以下代码根据C99合法吗?

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

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

C99(PDF)

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

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

从该PDF的第145页。

有帮助吗?

解决方案

是的,您可以在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功能在任何人想要的地方都不是一个使我想更改的功能:)

其他提示

这在C99和C89中都是合法的。查看定义复合语句的6.8.2

是的,您可以在任何块的开头创建一个变量。每次在C ++中输入块时,都可以初始化该变量,您可以在块中的任何地方创建它们。

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

是的,这在C99中是合法的,但是在块之后您不允许您访问“ X”。试图访问其范围之外的“ X”的行为不确定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top