C和C ++:转换和转换之间的区别

时间:2010-12-03 10:01:53

标签: c++ c casting

以下代码中第2行和第3行之间是否有任何区别?编译器在每种情况下做什么

char ch = 'A';     //line 1
int  i = ch;       //line 2
int  j = (int) ch; //iine 3

一般来说,Casting和Conversion(C和C ++)之间有什么区别?

4 个答案:

答案 0 :(得分:4)

最终效果没有区别。

强制转换是使用显式的,通用的内置强制转换符号进行转换。

虽然在某些情况下,当我们指从Derived *到Base *(或从Derived&到Base&)的隐式转换时,我们会说“up-cast”。

在某些情况下,我们会定义新的演员表示法。

术语的上述定义只是一个操作定义,也就是说,它不是一个定义,你可以推断某些东西是演员。强制转换只是被定义为强制转换的那些。 :-)例如,bool(x)是演员表,而!!x表示相同,也是显式表示法,不是演员表。

在C ++中,您可以并且最好使用指定的强制转换static_castconst_castdynamic_castreinterpret_cast,但可能会例外显示算术内置类型。一个原因是C样式转换(Other*)p或C ++特定符号OtherPtr( p ),可以根据上下文做不同的事情,特别是当代码稍微改变C风格的含义时演员可以改变。另一个原因是搜索C风格的演员阵容很困难。

那就是说,最好是尽可能避免演员阵容。

干杯&第h。,

答案 1 :(得分:2)

它们都是转换/强制转换,在第2行它只是隐含的,而在第3行它是明确的,没有功能差异。

答案 2 :(得分:1)

最终结果是相同的(即你的int值都是65)。

现在,第3行允许读者(或任何人可能必须维护代码) - 发现C演员;这是我的拙见。

如果此代码是C ++应用程序的一部分,那么至少有两个原因使用static_cast会更好:

  1. 在你的应用程序中找到一个C风格的static_cast要容易得多;除了更清楚地了解你对其他人阅读代码的意图
  2. C ++强制转换语法很长,这有助于限制强制转换(当然有时仍然需要强制转换:)。如果你从字符扩展到事物,要在字符串和数字之间进行转换,你将不得不使用类似于每个例子的流

    希望它有所帮助

答案 3 :(得分:0)

转换将一种类型的数据转换为另一种类型的过程。强制转换是一个操作符,它会导致转换(类型已经匹配的情况除外)。

在C中,大多数演员都是不必要的并被认为是糟糕的风格。在C ++中,C风格的演员表被许多人认为是糟糕的风格; C ++有一个更安全的演员系统,但由于我不使用C ++,我会留给别人解释。

顺便说一下,在你的例子中:

char ch = 'A';     //line 1
int  i = ch;       //line 2
int  j = (int) ch; //iine 3

假设这是C,您的第一行涉及转换为较小的类型(从intchar),而第二行和第三行涉及到较大类型的转换。当你忽略(在某些情况下是危险的,但不是在这里)转换为第1行中的较小类型时,明确(从不危险)转换为更大类型是相当愚蠢的。当然这甚至更愚蠢:

char ch = (char)'A';

大多数情况下,如果你发现自己需要演员,那就意味着你做错了什么,或者其他一些非常聪明的事......