为什么C标准不确定使用不确定变量?

垃圾值存储在哪里,出于何种目的?

出于效率原因,C选择不将变量初始化为某个自动值。 要初始化此数据,必须添加说明。 这是一个例子:

int main(int argc, const char *argv[]) { int x; return x; } 

产生:

 pushl %ebp movl %esp, %ebp subl $16, %esp movl -4(%ebp), %eax leave ret 

虽然这段代码:

 int main(int argc, const char *argv[]) { int x=1; return x; } 

产生:

 pushl %ebp movl %esp, %ebp subl $16, %esp movl $1, -4(%ebp) movl -4(%ebp), %eax leave ret 

如您所见,使用完整的额外指令将1移入x。 这曾经很重要,在嵌入式系统上仍然如此。

几年前,IIRC,Thompson或Richie接受了采访,他们说语言定义故意在某些地方使事情变得模糊不清,因此特定平台上的实施者有余地在该平台上做有意义的事情(周期,记忆等)。 对不起,我没有参考链接。

垃圾值实际上并未存储在任何地方。 实际上,就抽象语言而言,垃圾值并不存在。

您可以看到,为了生成最有效的代码,编译器根据对象 (变量)的生命周期进行操作是不够的。 为了生成最有效的代码,编译器必须在更精细的级别上运行:它必须根据生命周期 “思考”。 例如,这对于执行CPU寄存器的有效调度是绝对必要的。

抽象语言没有“价值终身”这样的概念。 但是,语言作者认识到该概念对优化编译器的重要性。 为了使编译器有足够的自由来执行有效的优化,有意地指定了语言,以便它不会干扰重要的优化。 这就是“垃圾价值”出现的地方。 该语言并未声明垃圾值存储在任何地方,该语言不保证垃圾值是稳定的(即重复尝试读取相同的未初始化变量可能很容易导致不同的“垃圾值”)。 这样做是为了使优化编译器能够实现“价值生命周期”的重要概念,从而执行比“对象生命周期”的语言概念所规定的更有效的变量操作。

C被设计成一种相对低级的语言,因此它可以用于编写,以及操作系统等低级别的东西。 (事实上​​,它的设计使得UNIX可以用C语言编写)您可以简单地将其视为具有可读语法和更高级别构造的汇编代码。 出于这个原因,C(减去优化)完全符合您的要求,仅此而已。

当你写int x; ,编译器只是为整数分配内存。 你从来没有要求它在那里存储任何东西,所以当你的程序开始时,该位置的任何东西都保持不变。 大多数情况下,事实certificate,预先存在的价值是“垃圾”。

有时,外部程序(例如设备驱动程序)可能会写入一些变量,因此无需添加另一条指令来初始化这些变量。

为什么C标准不确定使用不确定变量?

它不是:

  • 对于局部变量,它表示未定义的行为,这意味着任何事情(例如,段错误,擦除硬盘)都是合法的:( 为什么)使用未初始化的变量未定义行为?

  • 对于全局变量,它将它们归零: C中声明的未初始化变量会发生什么? 它有价值吗?