以下代码中第2行和第3行之间是否有任何区别?编译器在每种情况下做什么 ?
char ch = 'A'; //line 1
int i = ch; //line 2
int j = (int) ch; //iine 3
一般来说,Casting和Conversion(C和C ++)之间有什么区别?
答案 0 :(得分:4)
最终效果没有区别。
强制转换是使用显式的,通用的内置强制转换符号进行转换。
虽然在某些情况下,当我们指从Derived *到Base *(或从Derived&到Base&)的隐式转换时,我们会说“up-cast”。
在某些情况下,我们会定义新的演员表示法。
术语的上述定义只是一个操作定义,也就是说,它不是一个定义,你可以推断某些东西是演员。强制转换只是被定义为强制转换的那些。 :-)例如,bool(x)
是演员表,而!!x
表示相同,也是显式表示法,不是演员表。
在C ++中,您可以并且最好使用指定的强制转换static_cast
,const_cast
,dynamic_cast
和reinterpret_cast
,但可能会例外显示算术内置类型。一个原因是C样式转换(Other*)p
或C ++特定符号OtherPtr( p )
,可以根据上下文做不同的事情,特别是当代码稍微改变C风格的含义时演员可以改变。另一个原因是搜索C风格的演员阵容很困难。
那就是说,最好是尽可能避免演员阵容。
干杯&第h。,
答案 1 :(得分:2)
它们都是转换/强制转换,在第2行它只是隐含的,而在第3行它是明确的,没有功能差异。
答案 2 :(得分:1)
最终结果是相同的(即你的int值都是65)。
现在,第3行允许读者(或任何人可能必须维护代码) - 发现C演员;这是我的拙见。
如果此代码是C ++应用程序的一部分,那么至少有两个原因使用static_cast会更好:
希望它有所帮助
答案 3 :(得分:0)
转换将一种类型的数据转换为另一种类型的过程。强制转换是一个操作符,它会导致转换(类型已经匹配的情况除外)。
在C中,大多数演员都是不必要的并被认为是糟糕的风格。在C ++中,C风格的演员表被许多人认为是糟糕的风格; C ++有一个更安全的演员系统,但由于我不使用C ++,我会留给别人解释。
顺便说一下,在你的例子中:
char ch = 'A'; //line 1
int i = ch; //line 2
int j = (int) ch; //iine 3
假设这是C,您的第一行涉及转换为较小的类型(从int
到char
),而第二行和第三行涉及到较大类型的转换。当你忽略(在某些情况下是危险的,但不是在这里)转换为第1行中的较小类型时,明确(从不危险)转换为更大类型是相当愚蠢的。当然这甚至更愚蠢:
char ch = (char)'A';
大多数情况下,如果你发现自己需要演员,那就意味着你做错了什么,或者其他一些非常聪明的事......