📜  Javax++和x=x+1的区别

📅  最后修改于: 2021-09-12 10:40:07             🧑  作者: Mango

在 x++ 中,它将 x 的值增加 1,而在 x=x+1 中,它也将 x 的值增加 1。但问题是两者是相同的还是它们之间有任何区别。我们应该意识到,每当我们试图在两个变量 a 和 b 之间应用任何算术运算运算符,结果类型总是 max(int,a 的类型,b 的类型)。现在让我们看看它们之间的区别:

  1. 数据的内部类型转换:在下面的例子中,我们正在做算术运算,即 b 和 1 的加法。这里 b 是字节类型,1 是 int 类型。因此,结果应该是 int 类型,即 max(int,type of b ie byte,type of 1 ie int)。我们在上面的程序中将 int 类型分配给 byte 类型,这就是为什么我们会收到编译时错误,提示“可能丢失精度”。这里需要类型转换来执行加法。

    使用 x = x + 1

    // Java program to illustrate
    // how arithmetic operations performed
    // depends on data types
    public class Test 
    {
        public static void main(String[] args)
        {
            byte b = 10;
              
            // Using b = b+1
            b = b + 1;
            System.out.println(b);
              
            /* Using typecasting will work
            b=(byte)b+1;
            System.out.println(b);*/
        }
    }
    

    输出:

    error: incompatible types: possible lossy conversion from int to byte
    

    使用类型转换,输出将是

    11

    使用 x++

    在下一个例子中,我们正在做增量,但在内部我们正在做类似 b++ 的操作。结果应该是 int 类型,即 max(int,type of b ie byte,type of 1 ie int),我们得到的结果为 11,因为隐式类型转换是由编译器完成的,如 byte b=(byte)(b+1 ) 这里。

    // Java program to understand the 
    // operations of ++ operator
    public class Test 
    {
        public static void main(String[] args)
        {
        byte b = 10;
        b++;
        System.out.println(b);
        }
    }
    

    输出:

    11
    

    从上面的例子我们可以理解,在增量/减量运算符,编译器会在需要时自动进行类型转换。但是这是怎么发生的呢?让我们试着理解:
    假设我们必须执行增量然后我们使用 ++运算符:

    i++;

    只是一个快捷方式:

    i = i + 1;

    但是如果我们像这样取 i 和 j 的值呢:

    byte i = 1;
    Then i = i + 1;

    不会编译,因为我们将 int 值分配给字节类型,并且该语句中没有类型转换,但 i++;会编译好。
    这意味着实际上 i++;是这样的快捷方式

    i = (type of i)(i + 1);
  2. 两者的不同编译器指令:它们是不同的运算符,并且在字节码中使用不同的 JVM 指令。
    x + 1 uses iadd instruction, 
    whereas x++ uses iinc instruction internally

    虽然这取决于编译器。编译器可以自由地为特定操作使用一组不同的指令。