在C中,自动存储类的变量具有初始值作为垃圾值。但是以下列方式声明的变量每次都为所有这些变量赋值,而它应该是一个垃圾值。
this.form.reset();
答案 0 :(得分:3)
auto int i;
printf("%d",i);
此处不需要关键字auto
;它指定了一个默认的存储类。
上面代码的行为明确未定义。请参阅N1570 6.3.2.1第2段。措辞有点密集,但它描述了左值(基本上是指定对象的表达式)是如何被转换的#34;到存储在对象中的值 - 在这种情况下,相关对象是i
。
如果左值指定一个自动存储持续时间的对象 可以使用
register
存储类声明(从来没有 它的地址),并且该对象未初始化(未声明 使用初始化程序并且之前未执行任何赋值 使用),行为未定义。
i
中存储的值是任意的,实际上,检索该值很可能会给您一些看似int
值的内容,但行为访问是未定义的,这意味着标准没有说明实际发生的事情。编译器可以完全拒绝该程序,或者printf
调用的输出原则上可以是蓝色的超智能阴影(后者肯定不太可能)。
如果访问检索存储在该块内存中的任何值,则0
与任何其他值一样可能,可能更多。明天运行相同的程序时,您可能会获得不同的值。
(N1570是2011 ISO C标准的最新公开草案。)
答案 1 :(得分:-1)
第6.7.9节,第10节
如果没有显式初始化具有自动存储持续时间的对象,则其值为 indeterminate 。
第3.19.2节
不确定价值
未指定值或陷阱表示
第3.19.3节
未指定的值
本国际标准规定的相关类型的有效值否 要求在任何实例中选择哪个值
(这只有很小的改动,与C99中的措辞相同。)
换句话说,取决于编译器或偶然值是什么。可能会发生这样的情况:您使用的编译器对变量施加了额外的限制,并将它们默认为某个值。