为什么从float返回方法返回double不会导致c ++中的任何错误/警告

时间:2015-07-04 18:01:44

标签: java c++ g++ javac

我试图在Java中编译以下代码(只是一个代码段):

class MyClass{
        public float get100(){
        return 100.05;  // returning 100.05f should work
    }
}

但正如您可以看到100.5本质上是doubleget100()通过声明返回floatjavac会出现错误:{{ 1}}。

这完全可以理解。但这是我注意到的can't convert double to float

我尝试了以下代码(几乎与上面提到的相似):

c++

此代码在#include<iostream> using namespace std; class MyClass{ public: float get100(){ return 100.05; } }; int main(){ MyClass m; cout<<m.get100()<<endl; return 0; } ..

中正常运行

谁能告诉我为什么会这样?或者它是否意味着c++编译器足够聪明,它可以自动将c++转换为double

但由于float的范围高于double,如何在float中工作?

任何帮助/建议表示赞赏。提前致谢。

2 个答案:

答案 0 :(得分:3)

是的,C ++编译器非常智能,它可以自动将double转换为float。 Java编译器可以做同样的事情,但是Java的设计者决定最好不允许它,以防程序员犯了错误。

答案 1 :(得分:2)

cppreference.com on implicit conversions

  

浮点转换

     

浮点类型的prvalue可以转换为任何其他浮点类型的prvalue。如果转化列在浮点促销下,则为促销而非转化。

     
      
  • 如果源值可以在目标类型中准确表示,则不会更改。

  •   
  • 如果源值在目标类型的两个可表示值之间,则结果是这两个值之一(它是实现定义的那个)

  •   
  • 否则,行为未定义。

  •   

这里,案例是第二条规则。 100.05并不能完全代表float a double。对于0.37534等值,将应用第一个规则,因为源值可以准确表示。

对于Java,return是一个赋值上下文。 JLS§5.2州:

  

分配上下文允许使用以下之一:   *身份转换(§5.1.1)   *扩大原始转换(第5.1.2节)   *扩大参考转换(第5.1.5节)   *一个拳击转换(§5.1.7),可选地后跟一个加宽的引用转换   *一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换。

请注意,此处允许隐式缩小转换 ,除非返回的值是常量值(即编译器可以评估的最终字段或文字表达式)。