为什么C编译器不能进行类型推断?

Kaw*_*iKx 3 c types inference

在 的情况下long double x = 8.99999999999999999,该值将存储为,double因为未附加“L”。x当我已经将变量声明为long doublefloat 类型时,为什么 C 编译器不能进行类型推断?

小智 5

在 20 世纪 70 年代初,当 C 语言首次开发时,运行编译器的计算机速度很慢,内存也很少。因此,需要设计语言,使编译器能够简单,使编译能够快速。一个简单的编译器需要程序员告诉它一切,因为每次编译器需要推导时,它都会使用CPU和内存。

另一个我认为同样重要的原因是,开发和使用 C 的人们最初是用它编写一个操作系统,他们想要一种不试图变得聪明的语言。编写操作系统已经够棘手的了,无需猜测编译器可能会做什么或不会做什么:他们需要非常精确地控制发生的事情,从这个意义上说,更简单的语言对操作系统编写者来说是一个很大的好处。

由于这些原因,C 最终失去了许多在后几十年设计的、针对应用程序编程的高级语言现在拥有的功能。它没有面向对象,没有类型推断,没有垃圾收集,没有异常,也不支持线程。

未来 C 可能会被改变以拥有这样的东西(事实上,最新的 C 标准现在已经有了本地线程,但我相信它们是可选的),但总的来说,如果你想要这些东西,你想要一个不同的语言。实际上有数千种有趣的语言可供选择。

  • 这都是猜测。我们所知道的是 Dennis Ritchie 基于 BCPL 的传统,以这种方式设计了该语言。另一种解释是,里奇本来就不是真正的编译器编写者,并且犹豫是否要涉足当时角度不敢涉足的领域。 (2认同)