块和循环之间到底有什么区别?

时间:2020-08-14 07:33:16

标签: c

代码1:-无警告-无错误...一切正常

#include <stdio.h>

int main()
{
    int r = 1;
    printf("using %d\n", r);

    for (int k = 1; k <= 2; k++)
    {
       int r = r * 2;
    }

    return 0;
}

代码2:错误

#include <stdio.h>

int main()
{
    int cnt = 1;
    printf("using %d\n", cnt);
    
    {
        int cnt = cnt * 2;
    }

    return 0;
}

编译器响应:

'cnt' is used uninitialized in this function [-Werror=uninitialized]
       int cnt = cnt * 2;

因此,我知道在这种情况下loopblock之间存在一些差异,但我无法弄清楚。谁能告诉我scope of a variable在这里如何工作?

1 个答案:

答案 0 :(得分:2)

它们都有完全相同的问题,即rcnt在各自的程序中是自初始化的。

这可能是未定义,因为如果未初始化的变量恰好具有陷阱表示形式,则会使用未初始化的变量(其值不确定)。

gcc恰好在一种情况下检测到它,而在另一种情况下没有检测到。 gcc-Wuninitialized -Winit-self个选项,但是即使有这些选项,它仍然无法检测到第一种情况。无论如何,问题仍然存在(并且相同)。

相关问题