C ++中的类型转换

时间:2015-01-30 12:18:47

标签: c++ casting

我正在使用这本书学习C ++两个月:编程原理和使用C ++的练习,现在我想澄清一些关于我的演员的疑问。当我执行隐式转换时,例如:

char c = 'a'; 
int b = c; 

这里c的值隐式转换为int类型而不使用任何显式运算符。这被认为是铸造?或者当我必须执行如下的显式转换时,它被认为是铸造:

int a = 10; 
int b = 5.5; 
double sum = double (a) / b; 

我知道这听起来可能是一个愚蠢的问题,但我只想确定转换。

5 个答案:

答案 0 :(得分:18)

正如其他答案所述,演员表是明确写的。标准将它们称为显式类型转换; [expr.cast] / 2:

  

可以使用功能表示法表示显式类型转换   (5.2.3),类型转换运算符(dynamic_caststatic_cast,   reinterpret_castconst_cast)或演员表示法

我们称之为强制类型的表达式有三种,在上面引用中提到:

  • (T)expr。在标准中,此表单称为显式类型转换的强制表示法,通常也称为C样式强制转换(因为它是在C中使用并从C继承的语法)。 (double) a就是一个例子。

  • T(expr)。这是功能符号(也称为函数式转换)。通常用于创建类类型的临时工具,例如std::string("Hello World")double(a)也是一种功能风格的演员。

  • 最后但并非最不重要的是,所谓的类型转化运算符 static_cast<T>(expr), reinterpret_castconst_castdynamic_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;

由于adouble都是a s,因此明确地将b投射到int中;如果没有转换,则不会发生转换,从而导致整数除法,而浮点除法可能是优选的,因为它可能更精确。将/的一个操作数转换为double,这将导致另一个操作数被隐式转换为double,因此除法(及其结果)现在将是浮点数

如果仅使用double x = a;,您可以取消显式转化,因为int会隐式转换为doublelive 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。