【问题标题】:why first program outputs "garbage 300" and second program "0 300" why this is happening?为什么第一个程序输出“garbage 300”和第二个程序“0 300”为什么会这样?
【发布时间】:2020-11-09 21:01:09
【问题描述】:

在下面的代码输出中是“garbage 300”,但我希望这是“0 300”
为什么会这样?

    main()
    {
    int a = 300, b, c ;
 if ( a >= 400 )
    b = 300 ;
    c = 200 ;
    printf ( "\n%d %d", b, c ) ;
    }

在下面的代码中,它给出的预期输出为- 0 200

main( )
{
int a = 300, b, c ;
   
c = 200 ;
printf ( "\n%d %d", b, c ) ;
} 

【问题讨论】:

  • 因为b 仅在a>=400 的情况下分配。事实并非如此。适当的缩进会有所帮助。
  • @Divyank Lalwani 具有自动存储持续时间的未初始化变量具有不确定的值。
  • 为什么要更改问题中的代码?在这一项中,很明显您正在打印未初始化的变量 (b)。标题中没有提到“第二个程序”。
  • 未定义的行为是未定义的。欺骗Undefined, unspecified and implementation-defined behavior
  • 0 是一个完全有效的垃圾值...与-8002413217 一样有效

标签: c garbage


【解决方案1】:

自动变量不会自动初始化。在写作之前阅读它们是未定义的行为。对于整数,您通常会得到一些垃圾值(无论堆栈中发生什么)。

你的第一个程序是

main()
{
    int a = 300, b, c;
    if (a >= 400)
        b = 300;
    c = 200;
    printf("\n%d %d", b, c) ;
}

条件错误,所以 b 没有被赋值(它保持未初始化)。这就是你得到垃圾的原因。

第二个程序基本相同。在这种情况下,b 恰好具有垃圾值 0

自动变量是在没有存储类说明符staticextern 的函数中定义的所有变量。

【讨论】:

  • "自动变量不会自动初始化。" 这是一种非常讽刺的说法。我必须记住这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多