使用声明的未声明标识符'k'

时间:2018-02-18 18:44:07

标签: c loops for-loop int identifier

我是新手,非常感谢任何帮助。

  

使用未声明的标识符'k'

void initBricks(GWindow window)
{
    // print bricks
    for(int k = 0; k < ROWS; k++);
    {
        // int I have problem with

        int b = k;
        //coordinats
        int x = 2;
        int y = 10
    }
}

1 个答案:

答案 0 :(得分:6)

查看for循环后的分号:

for(int k = 0; k < ROWS; k++);
{
    // int I have problem with

    int b = k;
    //coordinats
    int x = 2;
    int y = 10
}

相同
for(int k = 0; k < ROWS; k++)   //<-- no semicolon here
{
}

{
    // int I have problem with

    int b = k;
    //coordinats
    int x = 2;
    int y = 10
}

k仅在for循环的块内有效,下一个块不起作用 了解k

你必须写

for(int k = 0; k < ROWS; k++)   //<-- no semicolon here
{
    int b = k;
    //coordinats
    int x = 2;
    int y = 10
}

在C中,变量的范围由块(代码行)决定 花括号),你可以这样:

void foo(void)
{
    int x = 7;
    {
        int x = 9;
        printf("x = %d\n", x);
    }

    printf("x = %d\n", x);
}

它会打印

9
7

因为有两个x变量。内循环中的int x = 9“覆盖”了x 外块。内循环x是与外部块x不同的变量, 但是当内环结束时,内环x停止退出。这就是你无法访问的原因 来自其他块的变量(除非内部循环不声明变量 同名)。这将例如生成编译错误:

int foo(void)
{
    {
        int x = 9;
        printf("%d\n", x);
    }

    return x;
}

你会收到这样的错误:

a.c: In function ‘foo’:
a.c:30:12: error: ‘x’ undeclared (first use in this function)
     return x;
            ^
a.c:30:12: note: each undeclared identifier is reported only once for each function it appears in

下一个代码将编译

int foo(void)
{
    int x;
    {
        int x = 9;
        printf("%d\n", x);
    }

    return x;
}

但你会得到这个警告

a.c: In function ‘foo’:
a.c:31:12: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
     return x;
            ^

在C99标准之前你不能写for(int i = 0; ...,你必须申报 for循环之前的变量。如今大多数现代编译器都使用C99作为默认值,这就是你看到的原因 很多答案在for()中声明变量。但变量i会 仅在for循环中可见,因此相同的规则适用于示例中 以上。请注意,这仅适用于for循环,无法执行while(int c = getchar()),您将收到错误消息 来自编译器。

还要注意分号,写

if(cond);
while(cond);
for(...);

与做

相同
if(cond)
{
}

while(cond)
{
}

for(...)
{
}

那是因为C语法基本上是在if之后,whilefor之后 你需要一个陈述或一块陈述。 ;是有效的陈述 哪个“没什么”。

在我看来,这很难找到错误,因为当你阅读大脑时经常错过; 看看这条线。