代码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;
因此,我知道在这种情况下loop
和block
之间存在一些差异,但我无法弄清楚。谁能告诉我scope of a variable
在这里如何工作?
答案 0 :(得分:2)
它们都有完全相同的问题,即r
和cnt
在各自的程序中是自初始化的。
这可能是未定义,因为如果未初始化的变量恰好具有陷阱表示形式,则会使用未初始化的变量(其值不确定)。
gcc
恰好在一种情况下检测到它,而在另一种情况下没有检测到。 gcc
有-Wuninitialized -Winit-self
个选项,但是即使有这些选项,它仍然无法检测到第一种情况。无论如何,问题仍然存在(并且相同)。