Java杂记2—运算符和表达式

对于java而言,数据类型有多种,而运算也是有多种的,本文会为大家讲解常见的运算符。

主要有:

  • 数学运算:加减乘除
  • 比较运算:大小比较
  • 逻辑运算:布尔值运算

运算符

赋值运算符

在之前的文章中我们讲过,声明变量就相当于在内存中得到了一块儿地,那么这块儿地上存什么,需要我们将数据赋值上去,赋值就是把这块位置的内容设为一个确定的值。

对变量进行赋值我们需要使用到的就是赋值运算符,常见的赋值运算符是=,注意:在java中=是用来赋值的。

数学运算符

数学运算符有加减乘除,符号分别是+-*/,另外还有取模运算符%,以及自增(++)和自减(–)运算符。取模运算适用于整数和字符类型,其他数学运算适用于所有数值类型和字符类型。加减乘除大部分情况和直观感觉是一样的,都很容易理解,需要注意的是++ — 以及和赋值运算符结合之后的+= -=。

注意类型的范围

在使用整数进行数学运算的时候,我们需要注意类型的范围,一旦计算结果超出了表示范围又没有用合适的类型接收就会出现问题。什么意思的呢?看下面的例子

int a = 2147483647*2; //2147483647是int能表示的最大值

此时打印a的结果是-2。解决方式是用long接收结果。

为什么会出现这样的情况?

需要从二进制说起,内容稍多,所以细节就不说来,简单说就是二进制加减法,当计算结果超出表示范围的时候,最高位往往是1,会被看做负数。

自动类型提升

在进行数学运算的时候我们需要注意的就是类型自动提升的问题,在之前讲解数据类型的时候提到过自动类型提升,本文不做过多的讲解。

  • 如果参与运算的值有double,结果自动提升为double
  • 如果参与运算的值有float,结果自动提升为float
  • 如果参与运算的值有long,结果自动提升为long
  • 其它情况(byte,short,char),结果默认提升为int

+= -=

当+ 和 赋值= 结合起来之后就相当于运算之后赋值,例如a+=2就相当于a=a+2,这两种方式没有结果上的区别,在使用的过程中也不会可以的区分,但是他们之间还是有区别的。

上文我们说到,在进行操作的时候,会发生自动类型提升,byte类型的a加10会变为int,*
通过+=的写法不会发生自动类型提升,同样-= = /=都不会发生自动类型提升。

自增(++)/自减(–)

在JDK中为我们提供了自增运算符++,自减运算符–,首先需要说明的是++ — 也不会发生自动类型提升。

例如:a++相当于a+=1相当于a=a+1。

a++是一个表达式,那么 a++
就会有一个表达式的计算结果,这个计算结果就是a的旧值(加1前的值)。相对的, ++a
表达式的计算结果a加1后的值。所以他们的本质区别是:表达式的值(运算结果) 是加1前的变量的值还是加1后的变量的值(自减也是如此)。换句话说:a++计算之后a的值确实加了1 ,但是a++这个表达式整体的值是加1之前的值。

a++ 没有 ++a 快 ++a省去一个寄存器

另自增自减是非线程安全的,自增自减运算符包含两个操作:一个加1(减1)的操作和一个赋值的操作,不是原子操作,因此,在多线程下,如果你要对共享变量实现自增自减操作,就要加,或者使用JDK提供的原子操作类(如 AtomincInteger
AtomicLong
等)提供的原子性自增自减方法。

比较运算符

也叫作关系运算符,会形成布尔表达式。主要用来计算两个值之间的关系,结果是一个布尔类型(boolean)的值。适用于所有数值类型和字符类型。

比较操作符有:大于(>),大于等于(>=),小于(<),小于等于(<=),等于(==),不等于(!=)。

在此处需要注意的是等于。等于使用两个等号==,而不是一个等号(=)。一个等号(=)表示赋值操作。

逻辑运算符

逻辑运算根据数据的逻辑关系,生成一个布尔值true或者false。逻辑运算只可应用于boolean类型的数据,但比较运算的结果是布尔值,所以其他类型数据的比较结果可进行逻辑运算。

逻辑运算符具体有:

  • 与(&):两个都为true才是true,只要有一个是false就是false
  • 或(|):只要有一个为true就是true,都是false才是false
  • 非(!):针对一个变量,true会变成false, false会变成true
  • 异或(^):两个相同为false, 两个不相同为true
  • 短路与(&&)
  • 短路或 (||)

逻辑运算的大部分都是比较直观的,需要注意的是&和&&,以及|和||的区别。

参考资料

http://www.cnblogs.com/jinggod/p/8424808.html

我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。

永远相信美好的事情即将发生。

原文 

https://juejin.im/post/5ae2cd716fb9a07aa43bef16

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java杂记2—运算符和表达式

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址