【问题标题】:Type casting/ conversion dilemma类型转换/转换困境
【发布时间】:2013-02-28 19:43:17
【问题描述】:

我仍然只是从 C++ 开始,还没有处理太多类型转换。我的印象是语法是 (type) (variables) 但是,这在这种情况下似乎不起作用。

float calcSphere (int radius)
{
    float sphereSA;

    sphereSA =  (4 * PI *  (radius*radius));

    return sphereSA;

}

PI 是在代码顶部使用#define PI 3.14 声明的符号常量,我试图通过使用(float) (4 * PI * (radius*radius)) 来解决这个问题,但这并没有解决任何问题。谷歌似乎也返回了关于这个主题的相当模糊的结果。有什么解决办法吗?

【问题讨论】:

  • 它对我有用,你遇到了什么错误?
  • 球体的表面积。我得到的错误是无效的一元类型参数(有“int”)。
  • @Revoo 对不起。我没有密切注意函数名称。我只是在看变量radius。公式是正确的。我不确定你的问题到底是什么。请发布完整的程序和错误信息。
  • @Pubby 我仔细检查了一遍,发现我在常量声明的末尾有一个分号,我可以发誓我没有放。我现在觉得自己像个白痴,但至少我知道一元是什么。代码现在按预期工作,感谢您的帮助!
  • @Revoo 您可以将其发布为您自己问题的答案。无论如何,#define 不应该在 C++ 中用于定义常量,因为您可以使用类型安全的 constconstexpr 关键字来代替。此外,不应使用 C 风格的强制转换,因为可以使用更安全的 static_cast 关键字。如果您使用它们,就不会遇到这些问题。

标签: c++ types casting type-conversion


【解决方案1】:

只是一个猜测,但是,您是否收到有关初始化将双精度转换为浮点数的警告(使用 MSVS)?或者可能它搞砸了 b/c 一切最终都被转换为 '4' 的整数 b/c?

如果是这样,问题是当你输入一个数字时,它是一个双精度数。但是您将它用作浮点数,要解决它,该数字必须是所投射的。例如

sphereSA = ((float) 4 * (float) PI * radius * radius);

但是,最好给编译器一些关于 PI 的类型信息。例如

namespace MyConstants {
    const float PI = 3.141;
}
sphereSA = ((float) 4 * MyConstants::PI * radius * radius);

【讨论】:

    【解决方案2】:

    您正在使用 C 风格的演员表。强制转换的语法随着 C++ 的变化而改变。 你想寻找这样的东西:

    dynamic_cast<something*>( yourthing );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多