- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C/C++ 中的类型转换到底是什么?编译器如何检查是否需要显式类型转换(并且有效)?它是否比较某个值所需的空间?例如,如果我有:
int a;
double b = 15.0;
a = (int) b;
如果我没记错的话, double 值需要比整数(4 字节)更多的空间(是 8 字节吗?!)。并且两者的内部表示完全不同(补二/尾数)。那么内部发生了什么?这里的示例非常简单,但在 C/C++ 中存在大量类型转换。
编译器(或程序员)如何知道我是否可以进行转换,例如FOO 到 BAR?
最佳答案
类型转换基本上是从一种类型到另一种类型的转换。它可以是隐式的(即由编译器自动完成,可能会在过程中丢失信息)或显式的(即由开发人员在代码中指定)。类型所占据的空间是次要的。更重要的是转换的适用性(有时是便利性)。
隐式转换可能会丢失信息,符号可能会丢失/获得,并且可能会发生上溢/下溢。编译器不会保护您免受这些事件的影响,除非通过编译时生成的警告。当派生类型隐式转换为基类型(按值)时,也会发生切片。
对于可能非常危险的转换(例如,从基类型到派生类型),C++ 标准需要显式强制转换。不仅如此,它还提供了更具限制性的显式强制转换,例如 static_cast
、dynamic_cast
、reinterpret_cast
和 const_cast
,其中每一个都进一步将显式转换限制为仅可能转换的子集,从而减少了转换错误的可能性。
有效的转换(隐式和显式)最终由 C/C++ 标准定义,尽管在 C++ 中,开发人员能够通过使用构造函数和重载来扩展用户定义类型(隐式和显式)的转换( Actor )运营商。
标准允许哪些类型转换以及不允许哪些类型转换的完整规则可能会变得相当复杂。我试图在这个答案中忠实地介绍其中一些规则的简洁摘要。如果您确实对允许和不允许的内容感兴趣,我强烈建议您访问标准并阅读有关类型转换的相应部分。
关于c++ - C/C++ 中的类型转换到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20140204/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!