【问题标题】:Explicit type casting operator in C/C++C/C++ 中的显式类型转换运算符
【发布时间】:2017-02-14 17:42:52
【问题描述】:

以下代码将浮点类型7.5转换为整数值7,余数丢失。在这里,类型转换运算符是int。我知道它在 C++ 中是有效的类型转换。

int main()
{
        int i;
        float f = 7.5;
        i = (int) f; // Valid in C/C++
}

但在C/C++ 中做同样事情的另一种方法是在要按类型转换的表达式之前使用函数表示法,并将表达式括在括号之间:

i = int (f); // It is worked in C++ but not C

所以,我有一个问题,在 C++ 中进行类型转换是否有效?

【问题讨论】:

标签: c++ c casting


【解决方案1】:

它是用 C++ 编写的。但是,尽管它是有效的,但 C++(与 C 相对)鼓励在你的转换中明确:

auto i = static_cast<int>(7.0);

(哦,使用类型安全的流而不是容易出错的 printf:

std::cout << i << "\n";

【讨论】:

  • 好答案。我会提到使用 static_cast 对类型安全性的改进。
  • 它在 C++ 中有效,但是——除非我弄错了——在 C 中无效。
  • @MartinR,你是对的。它在 C 中无效。请参阅 my answer
  • @MartinR:谢谢。确实 - 我对 C 知之甚少。已更正
【解决方案2】:
i = int (f);

在 C++ 中有效,但在 C 中无效。

根据 C99 标准,6.5.4 Cast 运算符

 cast-expression:
      unary-expression
      ( type-name ) cast-expression

C++ 支持上述形式的转换以及函数样式转换。函数风格转换就像调用类型的构造函数来构造对象。

查看以下使用 C 和 C++ 编译的块代码。

#include <stdio.h>

int main()
{
   float f = 10.2;
   int i = int(f);

   printf("i: %d\n", i);
}

非工作 C 程序:http://ideone.com/FfNR5r

工作 C++ 程序:http://ideone.com/bSP7sL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多