java运算符如何赋值

您将遇到的最常见的运算符之一是简单的赋值运算符=。你在课堂上看到过这个运算符Bicycle;它将右侧的值分配给左侧的操作数:

int cadence = 0;
int speed = 0;
int gear = 1;

此运算符也可用于对象以分配对象引用,如创建对象一节中所述。

赋值运算符主要是这几种:=、+=、-=、*=、/=、%=,其它和二进制相关的内容这里就不详细解释了。赋值类的运算符包括基本赋值运算符(=)和扩展的赋值运算符(+=、-=、*=、/=、%=)。我们来看一段代码:

public class AssignmentOperatorTest01 {
public static void main(String[] args) {
//基本的赋值运算符
int i;
i = 10;
System.out.println("i = " + i);
i = 100;
System.out.println("i = " + i);
//扩展的赋值运算符
int x = 10;
x += 1; //等同于 x = x + 1
System.out.println("x = " + x); //11
int y = 10;
y -= 1; //等同于 y = y - 1
System.out.println("y = " + y); //9
int z = 10;
z *= 2; //等同于 z = z * 2
System.out.println("z = " + z); //20
int m = 10;
m /= 3; //等同于 m = m / 3
System.out.println("m = " + m); //3
int n = 10;
n %= 3; //等同于 n = n % 3
System.out.println("n = " + n); //1
}
}
x += 1 和 x = x + 1 真的是完全相同的吗?我们来看下面的代码:

public class AssignmentOperatorTest02 {
public static void main(String[] args) {
byte b = 10;
// 以下程序编译报错,编译器提示错误信息为:
// Type mismatch: cannot convert from int to byte
/*
编译没有通过的原因:b 是 byte 类型,1 是 int 类型,根据之前
讲解的类型转换规则得知,byte 和 int 混合运算最后结果是
int 类型,int 类型的值无法直接赋值给 byte 类型的变量 b,
所以编译报错。
*/
// b = b + 1;
b += 1;  //  编译通过并可以正常运行
System.out.println("b = " + b); //11
// 通过以上的测试得出:b = b + 1 和 b += 1 是不一样的
// 那么 b += 1 等同于什么呢?
/*
实际上 java 对于扩展类的赋值运算符进行了特殊的处理,
所有的扩展赋值运算符,最终都不会改变运算的结果类
型,假设前面的变量是 byte 类型,那么后面的表达式运
算之后的结果还是 byte 类型。所以实际上 b += 1 等同于:
*/
b = (byte)(b + 1);
System.out.println("b = " + b);   // 12
b += 1000;   // 编译通过,并且可以正常运行
/*
以上代码实际上等同于:b = (byte)(b + 1000);
分析得出,显然结果已经超出了 byte 类型取值范围,
所以精度一定会损失,最终的结果需要对计算机
二进制的原码反码补码进行研究。
*/
System.out.println("b = " + b);   //  -12
}
}
根据以上代码测试得出,对于扩展类的赋值运算符在运算的过程中不会改变运算的结果类型,也就是说 byte b = 100; b += 1000;b 变量最初是 byte 类型,最后的运算结果还是一个 byte类型。这是一条固定的语法规则。在以后使用扩展类赋值运算符的时候要谨慎,不小心就会精度损失的。
————————————————
版权声明:本文为CSDN博主「Jason Puth」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_56052094/article/details/122491709

java运算符如何赋值

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注