自动铸造

Ива*_*вац 6 java casting

我必须编写n从用户获取数字的程序,然后计算总和:s = 1/1 + 1/2 + ... + 1/n.

我写了这段代码:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner unos = new Scanner(System.in);
        System.out.println("n=?");
        int n = unos.nextInt();

        double s = 0.0;
        for (int i = 1; i <= n; i++) {
            s = s + (1.0 / i);
        }
        System.out.println("s=" + s);
    }
}
Run Code Online (Sandbox Code Playgroud)

Java如何决定i在此语句中将int值转换为double:

s = s + (1.0 / i);
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 9

管理将哪种类型转换/提升为Java语言规范第5章 - 转换和促销中定义的其他类型的规则.

特别是对于大多数算术运算,请查看二进制数字促销部分.

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示数值类型的值,以下规则按顺序应用,使用扩展转换(第5.1.2节)根据需要转换操作数:

  • 如果任一操作数的类型为double,则另一个操作数转换为double.
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float.

在你的情况下,1.0是一个double,因此i转换为double(加宽转换).由于s已经是双倍,因此无需进一步转换.


ami*_*mit 5

如果类型之间没有匹配(并且将double与int分开不匹配),则选择以下之一,其中(1)具有最高优先级:

(1) identity conversion
(2) a widening primitive conversion
(3) a widening reference conversion 
(4) a boxing conversion optionally followed by a widening reference conversion
(5) an unboxing conversion optionally followed by a widening primitive conversion. 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它选择(2)拓宽原语.它不会将double更改为int,因为double-> int不是标识也不是加宽,所以唯一的左选择是将int加宽为double

更多信息:http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#184206