C 为什么printf()在下面的代码中打印0而不是10?

C 为什么printf()在下面的代码中打印0而不是10?,c,linux,variables,C,Linux,Variables,如果我编译并运行以下代码,它将打印0而不是10 #include<stdio.h> main() { int Var=10; { char Var=Var; printf("%d",Var); } } #包括 main() { int-Var=10; { char Var=Var; printf(“%d”,Var); } } 为什么打印0而不是10?因为在本地声明中 char Var=Var; 正确出现的Var指的是本地Var,而不是上

如果我编译并运行以下代码,它将打印0而不是10

#include<stdio.h>
main()
{
    int Var=10;
   {
     char Var=Var;
     printf("%d",Var);
   }
}
#包括
main()
{
int-Var=10;
{
char Var=Var;
printf(“%d”,Var);
}
}

为什么打印0而不是10?

因为在本地声明中

 char Var=Var;
正确出现的
Var
指的是本地
Var
,而不是上面的。如前所述,这是从未初始化的变量赋值

因此,您的声明根本不初始化
Var
,即
Var
包含垃圾。在您的特定情况下,垃圾恰好是0

顺便说一句,在同一个函数中有两个同音词
Var
,这真是太糟糕了


正如建议的那样,您应该使用
gcc-Wall-Wshadow
进行编译,然后在代码中会得到一些警告。(还要添加
-g
以获取调试信息,以便能够使用
gdb
进行调试)

假设您使用的是gcc,则需要启用-Wshadow()。 这将在与外部变量同名的内部变量处弹出一个错误。零是一个随机值。它可以打印那个地方的任何垃圾。

试试这个

#include<stdio.h>
main()
{
    int Var1=10;
   {
     char Var=Var1;
     printf("%d",Var);
   }
}
#包括
main()
{
int Var1=10;
{
char-Var=Var1;
printf(“%d”,Var);
}
}

<代码> = var < /Cord>已经指的是<代码> char Var < /C>。现在你想读这个:但是它是C++ Link,不应该包含垃圾吗?所以它可以打印垃圾值,包括<代码> 0 < /代码>。对!+1.编译器或IDE是否可以警告潜在问题。对不起,我已经习惯了因特利奇的检查。@巴西尔:现在有意义。它也不总是打印<代码> 0 <代码>。但是任何事情。你可能会考虑删除你的答案,因为它在编辑后已经变得多余。答案与这个答案有联系。可以删除吗?我不知道,这是问这个问题的好地方吗?