char ch = 'A'; //line 1
int i = ch; //line 2
int j = (int) ch; //iine 3
在C和C++中,铸造(Casting)和转换(Conversion)有什么区别?
char ch = 'A'; //line 1
int i = ch; //line 2
int j = (int) ch; //iine 3
最终效果没有区别。
强制类型转换是使用显式、通用、内置的强制类型转换符号进行转换。
虽然在某些情况下,我们说“向上转型”时是指从Derived*到Base*(或从Derived&到Base&)的隐式转换。
在某些情况下,还可以定义新的转换符号。
上述术语定义只是一个操作定义,也就是说,这不是一个可以推理出什么是强制类型转换的定义。强制类型转换只是那些被定义为强制类型转换的内容。:-)例如,bool(x)
是一种强制类型转换,而执行相同操作的 !!x
,虽然也是显式标注,但并不是一种强制类型转换。
在C++中,您可以使用命名转换 static_cast
、const_cast
、dynamic_cast
和 reinterpret_cast
,可能除了算术内置类型的显式转换。原因之一是C样式转换 (Other*)p
,或使用C++特定的记法 OtherPtr( p )
,可以根据上下文执行不同的操作,尤其是当代码稍作更改时,C样式转换的含义也会发生变化。另一个原因是很难搜索C样式转换。
话虽如此,最好尽可能避免使用强制类型转换。
祝福您&愿您拥有美好的一天。
两者都是转换/强制类型转换,在第2行中只是隐式的,而在第3行中是显式的,没有功能上的区别。
最终结果是相同的(也就是你的两个int都被赋值为65)。
现在,第3行允许读者(或可能需要维护代码的人)发现C转换;在我看来这是一个优点。
如果这段代码是C++应用程序的一部分,使用static_cast会更好,原因如下:
希望能对您有所帮助。
char ch = 'A'; //line 1
int i = ch; //line 2
int j = (int) ch; //iine 3
假设这是 C 语言,你的第一行涉及将一个更大的数据类型(从 int
转换为 char
),而第二行和第三行涉及将数据类型转换为更大的类型。当省略了第一行中某些情况下可能存在风险的小类型转换时,显式地进行(从未危险的)大类型转换是相当愚蠢的。当然,如果这样做会更愚蠢:
char ch = (char)'A';