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

题目:

short s1 = 1; 
s1 = s1 + 1;

有什么错?

short s1 = 1; 
s1 +=1;

有什么错?

此题咋一看,这两段代码貌似没有什么区别,但是它们的执行结果是不一样的。

结果是第一段代码会出错,第二段代码不会出错。

第一段代码的分析

这段代码的第二句(s1=s1+1)就是简单的两个数字相加,结果赋值给第一个变量。

此时运算结果的数据类型由以下规则依次决定:

1,如果参与相加运算的表达式或数字有double类型,则结果是double类型

2,如果参与相加运算的表达式或数字有float类型,则结果是float类型

3,如果参与相加运算的表达式或数字有long类型,则结果是long类型

4,如果参与相加运算的表达式或数字没有以上3中数据类型,则结果是一律是int类型

按照这个规则,s1=s1+1;那么最终的运算结果应该是int,所以赋值给short类型的s1会出错。

第二段代码的分析

类似于 num1 += num2 这样的形式的复合赋值表达式,,实际上等同于(num1的类型)(num1+num2),也就是将两个数相加之后的结果强制转型为赋值运算符左边操作数的数据类型。唯一的不同点就是num1只会计算一次,所以理论上复合赋值运算符的效率更高。

s1+=1;就会等同与 s1=(short)(s1+1);所以结果是没问题的。

各位是否明白了这个规则呢?请看以下两段代码,您是否能正确的说出答案呢?

下面的代码输出什么值?

short x = 3;
x += 4.6;
System.out.print(x);

下面的代码有错吗?

int i = 5;
long j = 8;
i = i + j;
i += j;
时间: 2024-10-17 15:25:50

复合赋值运算符 += 到底怎么运算的?的相关文章

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

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

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. 执行结果 ...................答案如下.............. 上面的代码的编译的时候会报错

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

大家好,今天要给大家介绍的是复合赋值运算符这个新的知识点.平时我们在修改一个变量值的时候,总是会用到下面的方法: 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 还有一些不太常见的

复合赋值运算符之谜

先看一个例题: //添加一个声明 while(i != 0){ i>>>=1; } 在添加声明处添加一行代码,使得上面的循环成为死循环 long i = -1: 或者 int = -1; 不能啊!!! 试试short i = -1: 出现什么了? 死循环了!!!! 既然出现了诡异现象(至少对于我是诡异) 为什么呢? 查阅资料发现复合赋值运算的一个规范 在复合赋值运算时,先将小于int的类型提升int型(即拓宽类型),然后进行计算,最后需要窄化的再窄化为指定的运算. 也就是说当i的类型为s

复合赋值运算符

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      

第三章.运算符

在Swift中你可以对浮点数进行取余运算( % ) 术语 运算符有一目, 双目和三目运算符. 一目运算符对操作一个对象, 如 -a. 一目运算符分为前置运算符和后置运算符, 前置运算符需紧排操作对象之前, 如 !b, 后置运算符需紧跟操作对象之后,如 i++, 双目运算符操作两个操作对象, 如 2 + 3. 是中置的, 因为它们出现在两个操作对象之间. 三目运算符操作三个操作对象, 和C语言一样, Swift只有一个三目运算符, 就是三目条件运算符 a ? b : c. 受运算符影响的值叫操作数

The Swift Programming Language-官方教程精译Swift(3)基本运算符

运算符是检查, 改变, 合并值的特殊符号或短语. 例如, 加号 + 把计算两个数的和(如 let i = 1 + 2). 复杂些的运行算包括逻辑与&&(如 if enteredDoorCode && passedRetinaScan), 还有自增运算符 ++i 这样让自身加一的便捷运算. Swift支持大部分标准C语言的运算符, 且改进许多特性来减少常规编码错误. 如, 赋值符 = 不返回值, 以防止错把等号 == 写成赋值号 = 而导致Bug. 数值运算符( + , -,

重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符

一.基本概念 重载的运算符时具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.和其他函数一样,重载的运算符也包含返回类型.参数列表以及函数体. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多.一元运算符有一个参数,二元运算符有两个.对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数.除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参. 当一个重载的运算符时成员函数时,this绑定到左侧运算