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

为什么C编译器不能做类型推断?,第1张

概述如果long double x = 8.99999999999999999,则该值将存储为double,因为未附加“L”.当我已经将变量x声明为long double float类型时,为什么C编译器不能进行类型推断? C编译器不进行类型推断,因为C不是类型安全的.你可以很容易地把事情变成无效,无效指针,然后再回来.这不符合规则.这至少意味着对C的任何类型的推断都只是近似的,并且最多你会让编译器为 如果long double x = 8.99999999999999999,则该值将存储为double,因为未附加“L”.当我已经将变量x声明为long double float类型时,为什么C编译器不能进行类型推断?解决方法 C编译器不进行类型推断,因为C不是类型安全的.你可以很容易地把事情变成无效,无效指针,然后再回来.这不符合规则.这至少意味着对C的任何类型的推断都只是近似的,并且最多你会让编译器为你提供关于你的类型出了什么问题的线索.

至于为什么C不进行类型推断:C中的类型不是为了强制逻辑关系,也不是用语言编码真值.在某种程度上,具有声音类型系统的语言(Haskell,OCaml,SML,Coq等……)意味着类型告诉你一些东西:有一个定理你可以从类型中记下你的程序. (参见Philip Wadler的“免费定理!”作为一个有趣的例子!)

那么为什么C使用类型呢?原因很简单,编译器需要知道 – 在某种程度上 – 如何组织存储在内存中的数据.而不是逻辑一致性,C中的类型可以告诉你如何布局,我应该把这个int放在一个结构中等等……

相反,C有许多习惯用法来模仿类型安全语言中的更多标准功能.例如,voID指针通常用于表示参数多态. (例如,你可以有一个列表,其中可以包含指向任何数据类型的指针.)事实上,它做了更多的事情,在C中你可以编码指向不同数据类型的列表.在传统的函数式语言中,列表的归纳类型要求所有元素都属于同一类型,您可以在C中轻松编码不合格类型和行(例如,在C中,通过使用标识符标记列表元素来完成).

有C的类型和内存安全方言,以Cyclone为例,在某些地方,多态性确实取代了像voID指针这样的事情,同时仍然给你很多C语言的细节.

总结

以上是内存溢出为你收集整理的为什么C编译器不能做类型推断?全部内容,希望文章能够帮你解决为什么C编译器不能做类型推断?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1220792.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存