加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:31:17 所属栏目:百科 来源:网络整理
导读:如果long double x = 8.99999999999999999,则该值将存储为double,因为未附加“L”.当我已经将变量x声明为long double float类型时,为什么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语言的细节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读