Java中x++和x=x+1的区别
在x++中,它使x的值增加1,在x=x+1中,它也使x的值增加1。但问题是它们是相同的或者它们之间有什么不同。我们应该意识到,当我们试图在两个变量a和b之间应用任何算术运算符时,结果类型总是max (int, a的类型,b的类型)。现在让我们看看两者之间的区别:
- 数据的内部强制类型转换:在下面的例子中,我们正在做算术运算i.e。b和1的加法。这里b是byte类型,1是int类型。因此,结果应该是int类型的i.e max(int,类型为b i.e)。Byte,类型为1 i.e。int)。在上面的程序中,我们将int类型赋值给字节类型,这就是为什么我们会得到编译时错误,说“可能失去精度”。这里需要类型转换来执行添加操作。
使用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类型i.e max(int,类型b i.e)。字节,类型为1 i.e。我们得到的结果是11日,因为隐式类型转换是由编译器完成的,比如这里的字节b =(字节)(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
从上面的例子中我们可以理解,在自增/自减操作符中,编译器在需要时自动进行类型转换。但这是怎么发生的呢?让我们试着去理解:
假设我们必须执行increment,那么我们使用++操作符:
i++;
只是一个快捷方式:
i = i + 1;
但是如果我们像这样取i和j的值会怎么样呢:
byte i = 1;
Then i = i + 1;
将无法编译,因为我们将int值赋值给字节类型,而该语句中没有类型转换,但i++;将编译好了。
这意味着事实上i++;这种事有捷径吗
i = (type of i)(i + 1);
- 两者的编译器指令不同:它们是不同的操作符,在字节码中使用不同的JVM指令。
x + 1 uses iadd instruction,
whereas x++ uses iinc instruction internally
尽管这依赖于编译器。编译器可以自由地为特定的操作使用不同的指令集。