需要帮助来理解为什么这段代码不能编译

时间:2017-05-18 21:37:19

标签: java syntax type-conversion operands

  

x + y的数据类型是什么?

     

double x = 39.21;

     

float y = 2.1;

     

说明:

     

这实际上是一个棘手的问题,因为这段代码无法编译!如   你可能还记得第1章,假定浮点文字   要加倍,除非后缀为f,如2.1f所示。如果值是   正确设置为2.1f,然后促销将类似于最后一次   例如,将两个操作数提升为double,以及结果   将是一个双重值。

     

但我不明白。如果float y = 2.1;被认为是双倍的   没有必要将变量y推广到double。   我对下一个问题感到困惑,那就是:

     

x * y / z的数据类型是什么?

     

短x = 14; float y = 13; double z = 30;

这本书说这将编译甚至浮动y = 13;不是浮动y = 13f。如果它们是小数,我只在浮点数旁边添加f吗?我真的看不出这个问题和上述问题之间的区别。

3 个答案:

答案 0 :(得分:3)

忽略char,Java将提升这样的数字类型:

byte > short > int > long > float > double

这些称为扩展转化。有关详细信息,请参阅JLS §5.1.2. Widening Primitive Conversion

二元运算符将提升为intlongfloatdouble,取其中最接近运算符的两个值,即结果永远不会{ {1}}或byte。示例:short会将双方都提升为byte + short。有关详细信息,请参阅JLS §5.6.2. Binary Numeric Promotion

赋值运算符还将执行扩展值的转换,并使用类型为intbyte常量表达式的额外规则,如果变量的类型为shortint,则byte将经过narrowing conversion,并且常量表达式的值可在类型中表示。请注意,没有将short常量缩小为double的规则。有关详细信息,请参阅JLS §5.2. Assignment Contexts

所以,对于你的代码:

float

如果已编译代码,double x = 39.21; // double constant to double (identity conversion) float y = 2.1; // fails because double constant cannot promote to float 的数据类型是什么?

x + y

答案:x + y // double + float promotes to double

下一部分:

double

现在,short x = 14; // narrowing conversion of int constant to short float y = 13; // widening conversion of int constant to float double z = 30; // widening conversion of int constant to double 的数据类型是什么?

x * y / z

答案:x * y // short * float promotes to float (x * y) / z // (float) / double promotes to double

答案 1 :(得分:0)

对于第一个问题,您不能将float(具有double值)初始化为double值。使用2.1f将该值初始化为float。所以你需要y = 2.1f。你可以在这里阅读更多相关信息 对于第二个问题,其工作原因是float是一个整数(13),可以将其提升为float类型。

答案 2 :(得分:0)

如此post中所述,如果您未在数字后面指定字符'f',则该值将被视为双精度。

如上所述,下面的代码段将编译,但前提是字符“f”被添加到浮点值的末尾。

double x = 7.0;
float y = 2.0f;
System.out.print(x + y);