【问题标题】:if statment and garbage value in C [duplicate]C中的if语句和垃圾值[重复]
【发布时间】:2016-01-11 07:04:13
【问题描述】:

我是 C 编程的新手。我知道这是一个非常简单的问题,但我需要一些建议。 我正在使用控制结构if statement 进行锻炼。我遇到了一个例子

这里是代码:-

#include<stdio.h>
int main()
{
    int a = 200, b, c ;
    if (a >= 300)
    {
        b = 100 ;
        c = 200 ;
    }
    printf ( "b=%d\nc=%d", b, c ) ;
    return 0;
} 

这个输出是:-

b=32767
c=0

在这里,我期望两个值的输出都为零。通过看到这个输出,我有点惊讶为什么变量b 中的垃圾值。

这背后的原因是什么?或者我以错误的方式声明变量。这背后的整个场景应该是什么?

【问题讨论】:

  • 如果它一直是 0 现在就不会是垃圾了吧?

标签: c initialization


【解决方案1】:

万一

if (a >= 300)

失败,bc 将不会被分配任何值。

现在,bc 是自动局部变量,除非显式初始化,否则它们包含不确定的值。

参考C11,第 §6.7.9 章,初始化

如果具有自动存储持续时间的对象未显式初始化,则其值为 不确定。[...]

使用单元化的局部变量来访问它们的值调用undefined behavior

参考同一标准的附件 §J.2,未定义的行为

具有自动存储持续时间的对象的值在它被使用时使用 不确定。

因此,始终建议初始化局部变量,例如

int a = 200, b = 0, c = 0;

也就是说,FWIW,int main() 至少应该是 int main(void) 以符合标准。

【讨论】:

  • 但是变量czero的值..我想它也必须是垃圾值..
  • 它有一个垃圾值。它恰好为零。 (垃圾的正确术语是“未定义的行为”,这意味着任何事情都可能发生。不能保证未定义的值看起来像垃圾。)
  • 这就是未定义行为的问题,它可以工作,也可以发生故障。
  • 是的,首先我们需要正确初始化变量以获得所需的结果..吸取教训。非常感谢。
【解决方案2】:

您似乎假设声明一个变量隐式地将其值设置为 0。

声明变量但不初始化是未定义行为的好地方。

一旦你声明了一个变量,它就会在堆栈上获得分配给它的内存,但不会对该内存空间做任何事情,因此它可以保存先前调用的数据剩余,或者只是堆栈空间上的垃圾数据。

之所以称为未定义行为,是因为该数据可能偶然是您期望的实际数据,但它可以(并且可能会)完全是其他东西。这是一种不确定的行为。

您需要做的是首先初始化这些值,以确保您的运行是确定性的。

【讨论】:

    【解决方案3】:

    你必须将你的变量初始化为 0:

    #include<stdio.h>
    int main()
    {
        int a = 200, b = 0, c  = 0;
        if (a >= 300)
        {
            b = 100 ;
            c = 200 ;
        }
        printf ( "b=%d\nc=%d", b, c ) ;
        return 0;
    } 
    

    在 C 和 C++ 中,您的声明不会将您的 int 变量初始化为 0。任何声明都以变量内的随机值结束...

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多