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

时间:2014-04-09 05:51:13

标签: c linux variables

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

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

为什么这是打印0,为什么不打印10?

3 个答案:

答案 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);
   }
}