我是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 :(得分:7)
以防
if (a >= 300)
失败,b
和c
将不会分配任何值。
现在,b
和c
是自动局部变量,除非明确初始化,否则它们包含不确定的值。
参考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.任何声明都以变量中的随机值结束......