晚上好, 这是一个如下所示的小程序。我在每次执行中寻找b的垃圾值,但得到相同的答案。 代码很简单如下:
#include<stdio.h>
#include<conio.h>
int main(void)
{
int a = 300, b,c;
if (a>=400)
b=300;
c=200;
printf("\n%d\n%d",b,c);
getch();
}
Codeblocks中的o / p如下
2
200
但如果我删除该行
b=300;
保留分号,然后它会给出垃圾值。
为什么会出现这种矛盾?
答案 0 :(得分:0)
这里2只是垃圾,你应该在&#39; if-statement&#39;之前打印b的值。并查看它是否与上一个print语句匹配。如果匹配则两者都是垃圾值,并且由于&#39; if-statement&#39;而没有发生任何变化。
关于编译器如何生成垃圾值的问题是不可预测的/随机的。
答案 1 :(得分:0)
阅读未初始化的变量遵循以下规则,
默认情况下,静态变量初始化为零表示本地静态或文件范围变量(全局变量)。
功能本地的非静态变量是不确定的。在分配值之前读取它们会导致未定义的行为。编译器可以自由地做任何事情。它可以是零,它可以是那里的值,它可以使程序崩溃。你完全没有保证。
它将简单地为您提供存储在堆栈中该位置的最后一个值(如果变量恰好存储在寄存器中,则在该寄存器中)。
未定义在不同编译器之间也可能有所不同。
答案 2 :(得分:0)
<强>解释强>
第1步: int a = 300, b, c;
此处变量a
已初始化为'300'
,变量b
和c
已声明,但未初始化。
第2步: if(a >= 400)
表示if(300 >= 400)
。因此这种情况将会失败。
第3步: c = 200;
此处变量c
已初始化为'200'
。
第4步: printf("%d, %d, %d\n", a, b, c);
它会打印"300, garbage value, 200"
。因为变量b
未初始化。