如果我编译并运行以下代码,则打印0而不是10。
#include<stdio.h>
main()
{
int Var=10;
{
char Var=Var;
printf("%d",Var);
}
}
为什么这是打印0,为什么不打印10?
答案 0 :(得分:19)
因为在本地声明中
char Var=Var;
正确出现的Var
是指本地Var
,而不是上层Var
。正如Alk所述,这是undefined behavior从未初始化的变量中分配。
因此,您的声明根本不会初始化Var
,即Var
包含垃圾。在您的特定情况下,该垃圾恰好为0。
gcc -Wall -Wshadow
真的很糟糕。
如this answer所示,您应该使用-g
进行编译,然后您的代码会收到一些警告。 (还要添加gdb
以获取调试信息,以便能够使用{{1}})
答案 1 :(得分:8)
假设您正在使用gcc,则需要打开-Wshadow(http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)。 这将在与外部具有相同名称的内部变量处弹出错误。零是随机值。它可以在那个地方打印任何垃圾。
答案 2 :(得分:2)
试试这个
#include<stdio.h>
main()
{
int Var1=10;
{
char Var=Var1;
printf("%d",Var);
}
}