如果C

时间:2016-01-11 07:04:14

标签: c initialization

我是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中的垃圾值。

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

3 个答案:

答案 0 :(得分:7)

以防

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)符合标准。

答案 1 :(得分:1)

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

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

一旦声明了一个变量,就会在堆栈上获得分配给它的内存,但是没有对该内存空间进行任何操作,因此它可以保存先前调用的数据,或者只是堆栈空间中的垃圾数据。

它被称为未定义的行为,因为该数据可能偶然是您期望的实际数据,但它可以(并且可能会)完全不同。这是一种非确定性的行为。

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

答案 2 :(得分:0)

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