运算中的一些小细节和原理分析

下面两种情况的原因:我们在赋值时,都是将 int 类型的常量赋给 byte 类型的变量,在这个过程中,编译器会进行判断,如果赋的值在 byte 类型值域内,就可以被赋值,反之依然会报错。

情况一:3+4 是两个常量相加,结果依然是常量,赋值时就会进行相应的判断,能赋值就赋值,不能赋值就不赋值,3+4=7,可以被赋值,所以不报错。

情况二:a/b/c 这三个都是变量,既然是变量,那就证明值是可变的,也就是说变量a加上变量b的值有可能超出 byte 的值域,所以编译报错,需要手动强转。

情况一:
byte a = 3;
a = 3 + 4;//不报错
情况二:
byte a = 3;
byte b = 4;
byte c = a + b;//会报错

为什么 a+=2 不报错,a=a+2 会报错呢?

就像上面说的,a 是变量,那么做运算时就有超出值域的可能性,a+=2 之所以不报错是因为在编译时,系统会自动帮我们进行强转,而 a=a+2 并不会,需要手动强转,这就是 a+=2 和 a=a+2 的一点区别。

为什么int类型的变量b并没有出现报错的情况呢?

是因为默认的int和double类型,即使超出值域了,也不会报错,而是直接将多余的部分砍掉,取剩下的值。

short a = 3;
a += 2;//编译不报错
a = a + 2;//编译报错
int b = 3;
b += 2;//不报错
b = b + 2;//不报错

下面 a=a++; 运算过后,a 的值还是 7,而不是 8,是因为:

a=a++ 整个运算过程如下:( b=a++ 运算过程一样,先算 ++ 再赋值)

             先定义一个临时变量将 a 的值存起来

            通过临时变量的值进行 ++ 运算,将运算结果赋值给 a

            然后再将临时变量的值再赋给变量 a,这样之前的运算结果就会被覆盖掉,所以 a 的值依然是 7

int a = 5;
a++;//a的值为6
int b = a++;//b的值为6,a的值为7
a = a++;//a的值为7

原文地址:https://www.cnblogs.com/xiaoyulong/p/8278947.html