C中的if语句和垃圾值

if statment and garbage value in C

我是 C 的新手 programming.I 知道这是一个非常简单的问题,但我需要一些建议。 我正在使用控制结构 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 中的垃圾值。

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

万一

if (a >= 300)

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

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

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

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.[...]

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

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

The value of an object with automatic storage duration is used while it is indeterminate.

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

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

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

您必须将变量初始化为 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。任何声明都以变量内的随机值结束...

你似乎假设声明一个变量隐式地将它的值设置为 0。

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

一旦你声明了一个变量,它就会在堆栈上获得分配给它的内存,但是没有对该内存做任何事情space,所以它可以保存以前调用的数据残留,或者只是垃圾数据堆栈 space.

之所以称为未定义行为,是因为该数据可能偶然是您期望的实际数据,但它也可以(而且很可能会)完全是其他东西。这是 non-deterministic 行为。

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