C和C++:强制转换和类型转换的区别

9
以下代码中第2行和第3行有什么区别?编译器在每种情况下都会做什么?
char ch = 'A';     //line 1
int  i = ch;       //line 2
int  j = (int) ch; //iine 3

在C和C++中,铸造(Casting)和转换(Conversion)有什么区别?


请参考此链接(https://dev59.com/zW855IYBdhLWcg3wcz5h),它应该能够澄清您的疑惑。 - Chubsdad
那个讨论是在C#的背景下进行的,也许在C和C++中,强制转换和类型转换与其他语言略有不同。 - Nawaz
抱歉,我更新了我的帖子。 - Chubsdad
4个回答

6

最终效果没有区别。

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

虽然在某些情况下,我们说“向上转型”时是指从Derived*到Base*(或从Derived&到Base&)的隐式转换。

在某些情况下,还可以定义新的转换符号。

上述术语定义只是一个操作定义,也就是说,这不是一个可以推理出什么是强制类型转换的定义。强制类型转换只是那些被定义为强制类型转换的内容。:-)例如,bool(x) 是一种强制类型转换,而执行相同操作的 !!x,虽然也是显式标注,但并不是一种强制类型转换。

在C++中,您可以使用命名转换 static_castconst_castdynamic_castreinterpret_cast,可能除了算术内置类型的显式转换。原因之一是C样式转换 (Other*)p,或使用C++特定的记法 OtherPtr( p ),可以根据上下文执行不同的操作,尤其是当代码稍作更改时,C样式转换的含义也会发生变化。另一个原因是很难搜索C样式转换。

话虽如此,最好尽可能避免使用强制类型转换。

祝福您&愿您拥有美好的一天。


2

两者都是转换/强制类型转换,在第2行中只是隐式的,而在第3行中是显式的,没有功能上的区别。


1

最终结果是相同的(也就是你的两个int都被赋值为65)。

现在,第3行允许读者(或可能需要维护代码的人)发现C转换;在我看来这是一个优点。

如果这段代码是C++应用程序的一部分,使用static_cast会更好,原因如下:

  1. 在应用程序中查找static_cast比查找C风格的转换要容易得多;此外,对于阅读代码的其他人来说,它更清晰地表达了您的意图。
  2. C++转换语法很冗长,有时可以帮助限制转换(当然有时仍然需要转换:)。如果您从字符扩展到其他内容,以便在字符串和数字之间进行转换,您将不得不使用类似于流的东西。

希望能对您有所帮助。


1
转换是将一种类型的数据转换为另一种类型的过程。强制转换是一种运算符,它会导致转换(除非类型已经匹配)。
在 C 语言中,大多数强制转换都是不必要的,被认为是不好的编程风格。在 C++ 中,许多人认为 C 风格的强制转换是不好的编程风格;C++ 有一个更安全的转换系统,但由于我不使用 C++,我将留给其他人来解释。
顺便说一下,在你的例子中:
char ch = 'A';     //line 1
int  i = ch;       //line 2
int  j = (int) ch; //iine 3

假设这是 C 语言,你的第一行涉及将一个更大的数据类型(从 int 转换为 char),而第二行和第三行涉及将数据类型转换为更大的类型。当省略了第一行中某些情况下可能存在风险的小类型转换时,显式地进行(从未危险的)大类型转换是相当愚蠢的。当然,如果这样做会更愚蠢:

char ch = (char)'A';

大多数情况下,如果你发现自己需要一个转换,那么这意味着你正在做错事情,或者是在做一些相当聪明的事情...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接