复合赋值运算符之谜

先看一个例题:

//添加一个声明
while(i != 0){
      i>>>=1;
}

在添加声明处添加一行代码,使得上面的循环成为死循环

long i = -1;

或者 int = -1;

不能啊!!!

试试short i = -1;

出现什么了?

死循环了!!!!

既然出现了诡异现象(至少对于我是诡异)

为什么呢?

查阅资料发现复合赋值运算的一个规范

在复合赋值运算时,先将小于int的类型提升int型(即拓宽类型),然后进行计算,最后需要窄化的再窄化为指定的运算。

也就是说当i的类型为short时,先转化成int型(0xFFFFFFFF),然后右移(0x7FFFFFFF),最后再窄化成short(0xFFFFFFFF)

再观看下面的代码:

short x = 1;
short y = 2;
short z = x + y;

运行发现

Thirtyfirst.java:7: 错误: 可能损失精度
        short z = x + y;
                    ^
  需要: short
  找到:    int
1 个错误

也就是说这里也存在一个隐含的先拓展为int型,然后需要强制为short型

总结:

<1>、在进行算术运算的时候,如果运算符两边的数值都是比 int还低(即byte或short类型时,都是自动先转换为int类型来进行运算的)

<2>、在进行运算的时候,会自动的转换成级别高的那个来进行运算的,故结果也是高级别的那个,如果想为低的就需强制类型转换

时间: 2024-08-09 22:58:40

复合赋值运算符之谜的相关文章

Java 之复合赋值运算符

1.引入问题 切入正题,看下面代码,结果应该是怎么样的 public class App{ public static void main( String[] args ){ byte a=1 ; int b = 10; a= a+b; System.out.println(a); a+=b; System.out.println(a); } } 这段代码的执行结果是什么?? 2. 执行结果 ...................答案如下.............. 上面的代码的编译的时候会报错

复合赋值运算符 += 到底怎么运算的?

题目: short s1 = 1;  s1 = s1 + 1; 有什么错? short s1 = 1;  s1 +=1; 有什么错? 此题咋一看,这两段代码貌似没有什么区别,但是它们的执行结果是不一样的. 结果是第一段代码会出错,第二段代码不会出错. 第一段代码的分析: 这段代码的第二句(s1=s1+1)就是简单的两个数字相加,结果赋值给第一个变量. 此时运算结果的数据类型由以下规则依次决定: 1,如果参与相加运算的表达式或数字有double类型,则结果是double类型 2,如果参与相加运算的

分享------关于复合赋值运算符

大家好,今天要给大家介绍的是复合赋值运算符这个新的知识点.平时我们在修改一个变量值的时候,总是会用到下面的方法: a = 0 a = a+1 在python中这种对a进行加法之后再赋值给a的情况,我们叫做自加,常见的操作当然还有自减,下面这种操作是专门为这种情况提供的语法. a = 0 a += 1 在上例中a+=1和a = a+1所描述的算术事实是完全一致的.都是在修改a变量让它的值+1 当然相似的常见操作还有. a = 100 a -= 1 上面的代码相当于a = a-1 还有一些不太常见的

Java千问:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!

我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符.复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步是赋值.比如说:上面的这两条语句相当于但是,如果碰到下面这样的情况,a的值该应该是多少呢?有人认为应该按以下方式来计算,因为我们都知道,在四则运算规则中,遵循"先乘除,后加减"的原则按照这样的方式来计算,得到a的值应该是7,但实际运行程序所得到的结果是8.这是为什么呢?就是因为复合赋值运算符在完成运算的时候,遵循一个规则:把&

复合赋值运算符

1.+= 例: int age=18; age+=3;//一般写法age=age+3; Console.WriteLine("age={0}",age); Console.ReadKey(); 输出结果:age=21 2.-= int age=18; age-=3;//一般写法age=age-3; Console.WriteLine("age={0}",age); Console.ReadKey(); 输出结果:age=15 3.*= int age=18; age

复合赋值运算符的使用

public class C2_7 {    public static void main(String args[])     {        int x,y,z;         x=1;         y=2;         z=3;         x+=y;//此时,x=3         y%=x;//此时,y=2         z/=x;//此时,z=1         System.out.print("\tx="+(x+=y));//此时,x=5      

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

JavaScript的位运算符、赋值运算符、其他运算符、三元运算符、运算符优先级

一. 位运算符 在一般的应用中,我们基本上用不到位运算符.虽然,它比较基于底层,性能和速度会非常好,而就是因为比较底层,使用的难度也很大,底层运算是转换成二进制进行运算的. 位运算符有七种,分别是:位非 NOT(~).位与 AND(&).位或 OR(|).位异或 XOR(^).左移(<<).有符号右移(>>).无符号右移(>>>). var box = ~25; //-26 var box = 25 & 3; //1 var box = 25 |

C语言:赋值运算符

1.简单赋值运算符 int a = 5; 赋值运算符的结合方向是:从右到左,而且优先级比算术运算符低 2.复合赋值运算符 +=:加赋值运算符.如a+=3+1,等价于 a=a+(3+1) -= :减赋值运算符.如a-=3+1,等价于 a=a-(3+1) *=:乘赋值运算符.如a*=3+1,等价于 a=a*(3+1) /=:除赋值运算符.如a/=3+1,等价于 a=a/(3+1) %= :取余赋值运算符