【问题标题】:C and C++ : Difference between Casting and ConversionC 和 C++:强制转换和转换之间的区别
【发布时间】:2011-05-19 16:00:58
【问题描述】:

下面代码中的第 2 行和第 3 行有什么区别吗?编译器在每种情况下做了什么?

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

一般来说,强制转换和转换(在 C 和 C++ 中)有什么区别?

【问题讨论】:

  • 请参考this,它应该可以澄清您的疑问
  • .. 讨论在 C# 上下文中.. 可能在 C 和 C++ 中,转换和转换与其他语言略有不同...
  • 抱歉,更新了我的帖子
  • .. 感谢您的更新.. :-)

标签: c++ c casting


【解决方案1】:

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

在 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';

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

【讨论】:

    【解决方案2】:

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

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

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

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

      希望对你有帮助

    【讨论】:

      【解决方案3】:

      最终效果没有区别。

      强制转换是使用显式、通用、内置的强制转换表示法进行转换。

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

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

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

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

      也就是说,最好的办法是尽可能避免强制转换。

      干杯,

      【讨论】:

        【解决方案4】:

        它们都是转换/强制转换,在第 2 行它只是隐式的,而在第 3 行它是显式的,没有功能上的区别。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-26
          • 2021-05-28
          • 2012-02-10
          • 1970-01-01
          • 2013-12-15
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          相关资源
          最近更新 更多