如果C中的语句和垃圾值
我是C编程的新手。我知道这是一个非常简单的问题,但我需要一些建议。 我正在使用控制结构if statement
。 我遇到了一个例子
这是代码: –
#include 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)
失败, b
和c
将不会被分配任何值。
现在, b
和c
是自动局部变量,除非明确初始化,否则它们包含不确定的值。
参考C11
,章节§6.7.9, 初始化
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。[…]
使用单元化局部变量来访问它们的值会调用未定义的行为 。
对于未定义的行为 ,参考同一标准的附录§J.2
具有自动存储持续时间的对象的值在不确定时使用。
因此,始终建议初始化局部变量,例如
int a = 200, b = 0, c = 0;
也就是说,FWIW, int main()
应该是int main(void)
,至少要符合标准。
看起来你假设一个变量隐式地将它的值设置为0。
声明变量但不初始化是未定义行为的好地方。
一旦声明了一个变量,它就会在堆栈上获得分配给它的内存,但是没有对该内存空间进行任何操作,因此它可以保存先前调用的数据,或者只是堆栈空间中的垃圾数据。
它被称为未定义的行为,因为该数据可能偶然是您期望的实际数据,但它可以(并且可能将)完全不同。 这是一种非确定性行为。
您需要做的是首先初始化值,以确保您的运行是确定性的。
您必须将变量初始化为0:
#include 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.任何声明都以变量内的随机值结束…