Java中的运算符大致分为:算术运算符、赋值运算符、关系运算符、逻辑运算符和位运算符五类。

(1)、算术运算符:+  -  *  /  %  ++  --

(2)、赋值运算符:=  +=  -=  *=  /=  %=

(3)、关系运算符:==  !=  >  >=  <  <=

(4)、逻辑运算符:&  |  !  ^   &&   ||

(5)、位运算符:&  |  ~  ^  <<  >>  >>>

一、算术运算符

按照操作数数目分为单目运算符(一元运算符)和双目运算符(二元运算符)。

1、单目运算符,只有一个操作数。

单目运算符有: + (正)  - (负)  ++  (自增)   --  (自减)。

++  (自增) 和--  (自减)放在操作数前面,称为前自增(自减),要先对被操作数作自增1或自减1运算,再进行其它的运算操作。

反之,++  (自增) 和--  (自减)放在操作数后面,称为后自增(自减),要先进行其它运算,再进行自增1或自减1运算。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int a = 5;
  4. int x, y;
  5. x = +a;// 正值
  6. System.out.println("x=" + x);// 打印结果:x=5
  7. y = -a;// 负值
  8. System.out.println("y=" + y);// 打印结果:y=-5
  9. // 前自增
  10. int i = 5;
  11. System.out.println("++i=" + (++i));// 打印结果:++i=6
  12. System.out.println("i=" + i);// 打印结果:i=6
  13. // 后自增
  14. i = 5;
  15. System.out.println("i++=" + (i++));// 打印结果:i++=5
  16. System.out.println("i=" + i);// 打印结果:i=6
  17. // 前自减
  18. int j = 12;
  19. System.out.println("--j=" + (--j));// 打印结果:--j=11
  20. System.out.println("j=" + j);// 打印结果:j=11
  21. // 后自减
  22. j = 12;
  23. System.out.println("j--=" + (j--));// 打印结果:j--=12
  24. System.out.println("j=" + j);// 打印结果:j=11
  25. }
  26. }

2、双目运算符,有两个操作数,运算符在操作数之间。

双目运算符有: + (加)  - (减)  * (乘)  / (除)  % (求余或者取模)。

三点注意

(1)、在java程序中的运算符不可以省略,在数学上y=2x,可以省略乘号,但java里必须写y=2*x;

(2)、在进行除法运算时,当除数和被除数都是整数时,得到的结果也是一个整数(会忽略小数部分)。如果除法运算有小数参与,得到的结果会是一个小数.

(3)、在进行求余(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。如:-5%3=-2;而5%-3=2;

求余记住:任意正整数%2,结果要么是0,要么是1,用于切换条件。左边如果小于右边,结果是左边。左边如果等于右边,结果是0。右边是1,结果为0。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. int x = 5, y = 12;
  4. System.out.println(x + "+" + y + "=" + (x + y));// 相加结果:5+12=17
  5. System.out.println(x + "-" + y + "=" + (x - y));// 相减结果:5-12=-7
  6. System.out.println(x + "*" + y + "=" + (x * y));// 相乘结果:5*12=60
  7. System.out.println(y + "/" + x + "=" + (y / x));// 相除结果:12/5=2
  8. // 求余
  9. System.out.println(5 % -3);// 模数为负数求余结果:2
  10. System.out.println(-5 % 3);// 被模数为负数求余结果:-2
  11. System.out.println(12 % 5);// 普通求余结果:2
  12. System.out.println(12 % 2);// 模数为2求余结果:0
  13. System.out.println(12 % 1);// 模数为1求余结果:0
  14. System.out.println(12 % 12);// 被模数与模数相等求余结果:0
  15. System.out.println(5 % 6);// 被模数小于模数求余结果:5
  16. }
  17. }

二、赋值运算符

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。

赋值运算符有:

= (赋值,注意与==区别)  把等式右边的值赋给等式左边的变量。

+= (加等)把等式左右两边的值相加之后的值赋给左边的变量。

-=
(减等)   把等式左右两边的值相减之后的值赋给左边的变量。

*=  (乘等) 把等式左右两边的值相乘之后的值赋给左边的变量。

/=  (除等) 把等式左右两边的值相除之后的值赋给左边的变量。

%= (模等) 把等式左右两边的值求余之后的值赋给左边的变量。

三点注意

(1)、在java中可以通过一条赋值语句对多个变量进行赋值。示例:
int x,y,z;
x=y=z=5;//为三个变量同时赋值。
错误写法:int x=y=z=5;

(2)、除了=,其它都是特殊的赋值运算符,以+=为例,x+=3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。其它赋值运算符都可以此类推。

(3)、在使用+=、-=、*=、/=、%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显示的声明。

三、关系运算符

关系运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。

关系运算符有:==(相等)  !=(不等)   >(大于)   >= (大于等于)   <(小于)   <=(小于等于)

注意:不能将关系运算符==写成赋值运算符=,二者是不同的运算符,运算结果是不同的。切记!

  1. public class Demo {
  2. public static void main(String[] args) {
  3. System.out.println(12 == 21);// 判断是否相等,结果为:false
  4. System.out.println(5 != 6);// 判断是否不相等,结果为:true
  5. System.out.println(4 > 3);// 判断4是否大于3,结果为:true
  6. System.out.println(4 >= 4);// 判断4是否大于等于4,结果为:true
  7. System.out.println(3 < 5);// 判断3是否小于5,结果为:true
  8. System.out.println(6 <= 5);// 判断6是否小于等于5,结果为:false
  9. }
  10. }

四、逻辑运算符

逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。

逻辑运算符有:

&(与):两边都为真结果为真,否则为假。

|(或)  :两边只要有一个为真,结果为真,否则为假。

! (非)  :非真则为假,非假则为真。

^ (异或)   :两边相同则为假,两边不同则为真。

&&(短路与) :两边都为真结果为真,否则为假。

||(短路或):两边只要有一个为真,结果为真,否则为假。

特别注意:

&与&&的区别:&无论左侧条件为真还是为假,都会计算判断右侧的条件。而&&当左侧条件为假时,不会计算判断右侧的条件,当左侧为真,才会继续判断右侧的条件。因为与运算结果为真必须满足左右两边条件都为真。

|与||的区别:|无论左侧条件为真还是为假,都会计算判断右侧的条件。而||当左侧条件为真时,不会计算判断右侧的条件,当左侧为假时,才会继续判断右侧的条件。因为或运算结果为真只要满足一边为真即可。

程序开发中建议使用&&(短路与) 和||(短路或),提高执行效率。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. // !非 真变假,假变真
  4. System.out.println(!(12 > 21));// 结果为:true
  5. System.out.println(!true);// 结果为:false
  6. // ^异或 两操作数一真一假,结果才为真,否则为假
  7. int x = 18;
  8. System.out.println(x >= 18 ^ x < 18);// 结果为:true
  9. System.out.println(x < 18 ^ x == 18);// 结果为:true
  10. System.out.println(x != 18 ^ x > 18);// 结果为:false
  11. System.out.println(x == 18 ^ x <= 18);// 结果为:false
  12. // 逻辑与&、短路与&& 两操作数同真,结果为真,否则为假
  13. int y = 5;
  14. System.out.println(y > 5 & y <= 5);// 结果为:false
  15. System.out.println(y >= 5 && y < 5);// 结果为:false
  16. System.out.println(y != 5 & y < 5);// 结果为:false
  17. System.out.println(y == 5 && y <= 5);// 结果为:true
  18. // 逻辑或|、短路或|| 两操作数同假,结果为假,否则为真
  19. int z = 2;
  20. System.out.println(z != 18 | z > 18);// 结果为:true
  21. System.out.println(z >= 18 || z == 18);// 结果为:false
  22. System.out.println(z <= 18 | z > 18);// 结果为:true
  23. System.out.println(z != 18 || z == 18);// 结果为:true
  24. // 短路与测试
  25. int i1 = 18;
  26. System.out.println(i1 != 18 && i1++ > 18);// 结果为:false
  27. System.out.println("i1:" + i1);// 由于左边条件为false,所以右边的表达式未作判断,i1结果为:18
  28. int i2 = 18;
  29. System.out.println(i2 != 18 & i2++ > 18);// 结果为:false
  30. System.out.println("i2:" + i2);// 左边条件为false,右边依然需要判断,i1结果为:19
  31. // 短路或测试
  32. int j1 = 18;
  33. System.out.println(j1 == 18 || j1++ > 18);// 结果为:true
  34. System.out.println("j1:" + j1);// 由于左边条件为true,所以右边不作判断,j1结果为:18
  35. int j2 = 18;
  36. System.out.println(j2 == 18 | j2++ > 18);// 结果为:true
  37. System.out.println("j2:" + j2);// 左边条件为true,右边依然需要判断,j2结果为:19
  38. }
  39. }

奉上逻辑运算符真值表:

五、位运算符

位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。

位运算符有:&(按位与) |(按位或) ~(取反) ^(按位异或) <<(左移)  >>(右移)  >>>(无符号右移)

位运算操作的真值表与逻辑运算符的真值表完全相同。只是位运算的操作数和结果都是二进制整数。

(1)、按位与运算符“&”是将参与运算的两个二进制数进行与运算,如果两个二进制位都为1,则该位的运算结果为1,否则为0.

例如:将6和11进行与运算,6对应的二进制数是00000110,11对应的二进制数是00001011.具体演算过程如下:

00000110

&     00001011

00000010

运算结果为00000010,对应数值为2.

(2)、 按位或运算符“|”是将参与运算的两个二进制数进行或运算,如果二进制位上有一个值为1,则该位的运行结果为1,否则为0.

例如:将6与11进行或运算。

00000110

|      00001011

00001111

运算结果为00001111,对应的数值是15.

(3)、取反运算符“~”只针对一个操作数进行操作,如果二进制位是0,则取反值为1,如果是1,则取反值为0.

例如:将6进行取反运算。

~     00000110

11111001

运算结果为11111001,对应的数值是-7

(4)、按位异或运算符“^”是将参与运算的两个二进制数进行异或运算,如果二进制位相同,则值为0,否则为1.

例如:将6和11进行异或运算。

00000110

^      00001011

00001101

运算结果为00001101,对应数值是13.

一个数异或同一个数两次,结果还是那个数。

(5)、左移运算符“<<”就是将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去。(一个整数向左移动几位就乘以2的几次幂),越移越大。

例如:将11左移动一位。

<<1        00001011

00010110

运算结果为00010110,对应数值是22.(亦或是11*2的1次方=22)

(6)、右移运算符“>>”就是将操作数所有二进制位向右移动一位。运算时,左边的空位根据原数的符号补0或1(原来是负数就补1,是正数就补0)(一个整数向右移动几位就除以2的几次幂,高位时0就补0,是1就补1),越移越小。

例如:将11右移一位

>>1        00001011

00000101

运算结果为00000101,对应的数值是5.

(7)、无符号右移运算符“>>>”就是将操作数所有二进制位向右移动一位,左边的空位补0(即不考虑原数的正负情况,最高位都用0补)

例如:将11无符号右移一位

>>>1      00001011

00000101

运算结果为00000101,对应的数值是5.

特殊的运算符:条件运算符(三目运算符)

格式为:<表达式1>?<表达式2>:<表达式3>

执行流程:先计算表达式1的值,当表达式1为true,则把表达式2的值作为整个表达式的结果;当表达式1为false,则将表达式3的值作为整个表达式的结果。

附运算符优先级表

优先级 运算符 结合性
1 . [] () 从左向右
2 ++ -- ~ !(数据类型) 从右向左
3 */ % 从左向右
4 + - 从左向右
5 << >> >>> 从左向右
6 < ><= >= 从左向右
7 == != 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 =  *=  /= %=  +=  -= <<=  >>=  >>>= &=  ^=  /= 从右向左
 

Java编程基础-运算符的更多相关文章

  1. Java编程基础——运算符和进制

    Java编程基础——运算符和进制 摘要:本文主要介绍运算符和进制的基本知识. 说明 分类 Java语言支持如下运算符: ◆ 算术运算符:++,--,+,-,*,/,%. ◆ 赋值运算符:=,+=,-= ...

  2. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  3. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  4. java编程基础二进制

    0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...

  5. Java编程基础-面向对象(中)

    本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...

  6. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  7. Java编程基础——流程控制

    Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...

  8. Java编程基础——常量变量和数据类型

    Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...

  9. Java编程基础——标识符和关键字

    Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...

随机推荐

  1. springMVC之HttpServletRequest的getParameterMap()

    request.getParameterMap()的返回类型是Map类型的对象,也就是符合key-value的对应关系,但这里要注意的是,value的类型是String[],而不是String. 得到 ...

  2. [ZJOI 2013] K大数查询

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3110 [算法] 整体二分 + 线段树 时间复杂度 : O(NlogN ^ 2) [代 ...

  3. 关于在项目中遇到MySQL数据库死锁的问题

    在MySQL中, 当一个事务去更新某条数据, 还没有提交的时候, 第二个事务去更新该数据, 则会出现等待获取锁超时异常: >> Lock wait timeout exceeded; tr ...

  4. Mertens

    题意: 求解$\sum_{i=a}^b{\mu(i)}$. 解法: 由$(\mu * I)(n) = e(n)$ 得 $\sum_{d|n}{\mu(d)} = [n=1]$ 得 $\mu(n) = ...

  5. classpath 和 classpath*的 区别:

    classpath 和 classpath*的 区别: classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径 ...

  6. UVa 1001 Say Cheese (Dijkstra)

    题意:给定一个三维空间的一些球和起始位置和结束位置,问你最短要花的时间是多少. 析:建图,所有的位置都建立图,边权就是距离,最小求一次最短路即可. 代码如下: #pragma comment(link ...

  7. Codeforces Round #383 【总结】

    总结一下这场... 搞起大号就崩了... A题没啥问题..通过电脑到手机上提交没啥大问题: B题,讲个最严重的问题,也是最近以来最严重的问题,虽然我说你开了个数组,虽然这个数组是不是最终的答案数组,但 ...

  8. STLstack,queue

    今天一开始用C去摸栈和队列,差不多昨天早上也在摸,摸烦了就去搞DP然后DP也没搞好,就是很烦很烦!!!! 然后今天那些C的栈队列的步骤和名称熟的不要不要的,然而数据结构的c语言用指针,传递,简直麻烦, ...

  9. Unity3d 3d角色换装实现原理及步骤

    http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画  但是不支持Ph ...

  10. 简单重载运算符in priority_queue By cellur925

    我们都知道priority_queue是大根堆. 一.变成小根堆 法一:把元素的相反数丢进堆中 法二 priority_queue<int,vector<int>,greater&l ...