我正在学习C中变量的范围。 有谁可以解释下面发生了什么?
int w;
printf("\nw=%d\n", w);
w =-1;
尽管我在'printf'之后初始化了变量'w',但它总是得到值“-1”。这让我很困惑,因为我希望它按顺序运行。因此,它应该打印一些随机值。 ***我也试过改变它的值,它总是读取书面值。因此,它没有随机显示“-1”
为了实验,我再次尝试了下面的代码。
int w;
printf("\nw=%d\n", w);
w =-9;
w =-1;
现在,它读取的值为“2560”。正如我所料,因为它之前没有正确初始化。
答案 0 :(得分:7)
在您的代码中
int w;
printf("\nw=%d\n", w);
当您尝试读取未初始化(自动本地)变量的值时,会调用undefined behavior。此时w
的内容是不确定的,输出结果是未定义的。
在读取(使用)值之前始终初始化本地变量。
相关:引用C11
,章节§6.7.9,初始化
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。 [....]
,与 Undefined behavior 相关,附件§J.2
使用具有自动存储持续时间的对象的值 不确定
答案 1 :(得分:4)
未初始化的变量。在" C"中,这意味着它的价值是"非确定性的"。实际上,变量通常根据什么"铺设"来获得一个值。在它被分配的内存地址。在这种情况下,它的一些值留在堆栈上。
恰好由于程序不应该依赖的外部因素,您经常会在多次运行中获得一致的结果。
答案 2 :(得分:2)
在第一种情况下,编译器正在优化w的赋值。在第二种情况下,它决定不进行优化。
在这两种情况下,编译器都可以选择优化两个分配,因为w在它们出现后不会被使用。
在使用变量之前初始化变量。
答案 3 :(得分:1)
在上述两种情况下
int w;
printf("\nw=%d\n", w);
会返回一个随机垃圾值,因为我们可能会调用它,包括-1
或2560
。
块引用
答案 4 :(得分:0)
如果不初始化变量,则可以包含垃圾值。因此,它是未定义的行为,在大多数情况下,它会打印随机数字。顺便说一句,正如其他人指出的那样,它取决于编译器,因此它可能与预期值一起工作,或者它可能不起作用。