有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对任何基元类型使用增量运算符可以吗?

我们都知道int++会将变量值增加1,也就是说:

int number = 0;
int temp = number + 1;
number = temp;

其他基本类型也允许这样做:

double number = 0D;
number++;

因此,我想知道上面的代码是否会被执行为:

double number = 0D;
double temp = number + 1D;
number = temp;

或:

double number = 0D;
int temp = number + 1;
number = temp;

在第二种情况下,我们是否应该选择double += 1D


共 (3) 个答案

  1. # 1 楼答案

    ++(前缀或后缀)并不是只在int上起作用的东西,如果您将它与其他原语类型一起使用,这并不意味着存在到int的中间转换

    请参阅Java语言规范:

    正如JLS所说,binary numeric promotion应用于变量和值1。在number++的情况下,其中numberdouble,这意味着1被视为double

    因此,如果numberdouble,那么number++的工作原理与number += 1D相同。没有必要显式地执行number += 1D

    注意:如果像你在问题中所建议的那样,中间转换为int,然后再转换回来,那么你可以预期:

    double number = 0.5;
    number++;
    

    将导致number变成1.0而不是1.5,因为转换将丢弃小数。但是,正如你所见,情况并非如此

  2. # 2 楼答案

    别担心。编译器知道如何最好地递增int、float或double类型。它将为每种情况生成高效的代码。如果你看一下生成的汇编程序代码,它很像是为以下内容生成的相同代码:

    doubleVar++;
    ++doubleVar;
    doubleVar += 1;
    doubleVar += 1.0;
    

    但是要注意,对于类类型来说,事情要复杂得多。这里使用运算符+或运算符+=重载。一般来说,增量后操作更耗时,因为必须在增量之前保存对象状态。因此,您应该习惯于始终使用增量前版本,即使对于标量类型也是如此,除非您确实需要增量后操作

  3. # 3 楼答案

    密码

    double number = 0D;
    number++;
    

    被执行为

    double number = 0D;
    number = number + 1D;
    

    生成的字节码

    // double number = 0D;
    0: dconst_0
    1: dstore_1
    
    // number + 1D
    2: dload_1
    3: dconst_1
    4: dadd
    
    // number =
    5: dstore_1