我正在使用这本书学习C ++两个月:编程原理和使用C ++的练习,现在我想澄清一些关于我的演员的疑问。当我执行隐式转换时,例如:
char c = 'a';
int b = c;
这里c的值隐式转换为int类型而不使用任何显式运算符。这被认为是铸造?或者当我必须执行如下的显式转换时,它被认为是铸造:
int a = 10;
int b = 5.5;
double sum = double (a) / b;
我知道这听起来可能是一个愚蠢的问题,但我只想确定转换。
答案 0 :(得分:18)
正如其他答案所述,演员表是明确写的。标准将它们称为显式类型转换; [expr.cast] / 2:
可以使用功能表示法表示显式类型转换 (5.2.3),类型转换运算符(
dynamic_cast
,static_cast
,reinterpret_cast
,const_cast
)或演员表示法。
我们称之为强制类型的表达式有三种,在上面引用中提到:
(T)expr
。在标准中,此表单称为显式类型转换的强制表示法,通常也称为C样式强制转换(因为它是在C中使用并从C继承的语法)。 (double) a
就是一个例子。
T(expr)
。这是功能符号(也称为函数式转换)。通常用于创建类类型的临时工具,例如std::string("Hello World")
。 double(a)
也是一种功能风格的演员。
最后但并非最不重要的是,所谓的类型转化运算符 static_cast<T>(expr),
reinterpret_cast
,const_cast
和dynamic_cast
。这些是最明确的符号,并且受到更多限制。
this Q/A中涵盖了所有这些内容的使用。
执行的每个其他转换都不称为强制转换。
答案 1 :(得分:16)
&#34;铸造及#34;仅在您执行显式转换时。
话虽如此,你会发现整个互联网和各个团队都滥用了这个术语!
答案 2 :(得分:11)
扩展(保留值)转换 - 转换回其原始类型后的结果将产生原始值的转换通常是隐式完成的。此
char c = 'x';
int b = c;
是隐式转换。显式转换称为强制转换。
int a = 1;
double sum = static_cast<double>(a) / b;
由于a
和double
都是a
s,因此明确地将b
投射到int
中;如果没有转换,则不会发生转换,从而导致整数除法,而浮点除法可能是优选的,因为它可能更精确。将/
的一个操作数转换为double
,这将导致另一个操作数被隐式转换为double
,因此除法(及其结果)现在将是浮点数
如果仅使用double x = a;
,您可以取消显式转化,因为int
会隐式转换为double
(live example)。从C ++ 11标准,N3337草案
- 如果任一操作数为double,则另一个操作数应转换为double。
有关已执行的隐式转化的完整列表,请参阅here。
答案 3 :(得分:2)
投射是表达式中变量的显式转换。喜欢这个
int a = 10;
int b = 5.5;
double sum = double (a) / b;
而这
char c = 'a';
int b = c;
..是隐式类型转换(或有时强制)的示例,其中数据类型从一种类型隐式升级到另一种类型 [like char to int]
请查看this文章,了解更多信息。
干杯!
答案 4 :(得分:1)
这不是强制转换,而是标准转换,如
中的C ++标准n3337所述§ 4标准转化次数
4.5整数促销
1)除bool之外的整数类型的prvalue,char16_t,char32_t, 或者wchar_t,其整数转换等级(4.13)小于等级 如果int可以表示,则int可以转换为int类型的prvalue 源类型的所有值;否则,源prvalue可以 转换为unsigned int类型的prvalue。