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)
失败,b
和 c
将不会被分配任何值。
现在,b
和 c
是自动局部变量,除非明确初始化,否则它们包含不确定的值。
参考 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 行为。
您需要做的是首先初始化值,以确保您的 运行 是确定性的。
我是 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)
失败,b
和 c
将不会被分配任何值。
现在,b
和 c
是自动局部变量,除非明确初始化,否则它们包含不确定的值。
参考 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 行为。
您需要做的是首先初始化值,以确保您的 运行 是确定性的。