Java编程基础-运算符
Java中的运算符大致分为:算术运算符、赋值运算符、关系运算符、逻辑运算符和位运算符五类。
(1)、算术运算符:+ - * / % ++ --
(2)、赋值运算符:= += -= *= /= %=
(3)、关系运算符:== != > >= < <=
(4)、逻辑运算符:& | ! ^ && ||
(5)、位运算符:& | ~ ^ << >> >>>
一、算术运算符
按照操作数数目分为单目运算符(一元运算符)和双目运算符(二元运算符)。
1、单目运算符,只有一个操作数。
单目运算符有: + (正) - (负) ++ (自增) -- (自减)。
++ (自增) 和-- (自减)放在操作数前面,称为前自增(自减),要先对被操作数作自增1或自减1运算,再进行其它的运算操作。
反之,++ (自增) 和-- (自减)放在操作数后面,称为后自增(自减),要先进行其它运算,再进行自增1或自减1运算。
- public class Demo {
- public static void main(String[] args) {
- int a = 5;
- int x, y;
- x = +a;// 正值
- System.out.println("x=" + x);// 打印结果:x=5
- y = -a;// 负值
- System.out.println("y=" + y);// 打印结果:y=-5
- // 前自增
- int i = 5;
- System.out.println("++i=" + (++i));// 打印结果:++i=6
- System.out.println("i=" + i);// 打印结果:i=6
- // 后自增
- i = 5;
- System.out.println("i++=" + (i++));// 打印结果:i++=5
- System.out.println("i=" + i);// 打印结果:i=6
- // 前自减
- int j = 12;
- System.out.println("--j=" + (--j));// 打印结果:--j=11
- System.out.println("j=" + j);// 打印结果:j=11
- // 后自减
- j = 12;
- System.out.println("j--=" + (j--));// 打印结果:j--=12
- System.out.println("j=" + j);// 打印结果:j=11
- }
- }
2、双目运算符,有两个操作数,运算符在操作数之间。
双目运算符有: + (加) - (减) * (乘) / (除) % (求余或者取模)。
三点注意:
(1)、在java程序中的运算符不可以省略,在数学上y=2x,可以省略乘号,但java里必须写y=2*x;
(2)、在进行除法运算时,当除数和被除数都是整数时,得到的结果也是一个整数(会忽略小数部分)。如果除法运算有小数参与,得到的结果会是一个小数.
(3)、在进行求余(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。如:-5%3=-2;而5%-3=2;
求余记住:任意正整数%2,结果要么是0,要么是1,用于切换条件。左边如果小于右边,结果是左边。左边如果等于右边,结果是0。右边是1,结果为0。
- public class Demo {
- public static void main(String[] args) {
- int x = 5, y = 12;
- System.out.println(x + "+" + y + "=" + (x + y));// 相加结果:5+12=17
- System.out.println(x + "-" + y + "=" + (x - y));// 相减结果:5-12=-7
- System.out.println(x + "*" + y + "=" + (x * y));// 相乘结果:5*12=60
- System.out.println(y + "/" + x + "=" + (y / x));// 相除结果:12/5=2
- // 求余
- System.out.println(5 % -3);// 模数为负数求余结果:2
- System.out.println(-5 % 3);// 被模数为负数求余结果:-2
- System.out.println(12 % 5);// 普通求余结果:2
- System.out.println(12 % 2);// 模数为2求余结果:0
- System.out.println(12 % 1);// 模数为1求余结果:0
- System.out.println(12 % 12);// 被模数与模数相等求余结果:0
- System.out.println(5 % 6);// 被模数小于模数求余结果:5
- }
- }
二、赋值运算符
赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。
赋值运算符有:
= (赋值,注意与==区别) 把等式右边的值赋给等式左边的变量。
+= (加等)把等式左右两边的值相加之后的值赋给左边的变量。
-=
(减等) 把等式左右两边的值相减之后的值赋给左边的变量。
*= (乘等) 把等式左右两边的值相乘之后的值赋给左边的变量。
/= (除等) 把等式左右两边的值相除之后的值赋给左边的变量。
%= (模等) 把等式左右两边的值求余之后的值赋给左边的变量。
三点注意:
(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。
关系运算符有:==(相等) !=(不等) >(大于) >= (大于等于) <(小于) <=(小于等于)
注意:不能将关系运算符==写成赋值运算符=,二者是不同的运算符,运算结果是不同的。切记!
- public class Demo {
- public static void main(String[] args) {
- System.out.println(12 == 21);// 判断是否相等,结果为:false
- System.out.println(5 != 6);// 判断是否不相等,结果为:true
- System.out.println(4 > 3);// 判断4是否大于3,结果为:true
- System.out.println(4 >= 4);// 判断4是否大于等于4,结果为:true
- System.out.println(3 < 5);// 判断3是否小于5,结果为:true
- System.out.println(6 <= 5);// 判断6是否小于等于5,结果为:false
- }
- }
四、逻辑运算符
逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。
逻辑运算符有:
&(与):两边都为真结果为真,否则为假。
|(或) :两边只要有一个为真,结果为真,否则为假。
! (非) :非真则为假,非假则为真。
^ (异或) :两边相同则为假,两边不同则为真。
&&(短路与) :两边都为真结果为真,否则为假。
||(短路或):两边只要有一个为真,结果为真,否则为假。
特别注意:
&与&&的区别:&无论左侧条件为真还是为假,都会计算判断右侧的条件。而&&当左侧条件为假时,不会计算判断右侧的条件,当左侧为真,才会继续判断右侧的条件。因为与运算结果为真必须满足左右两边条件都为真。
|与||的区别:|无论左侧条件为真还是为假,都会计算判断右侧的条件。而||当左侧条件为真时,不会计算判断右侧的条件,当左侧为假时,才会继续判断右侧的条件。因为或运算结果为真只要满足一边为真即可。
程序开发中建议使用&&(短路与) 和||(短路或),提高执行效率。
- public class Demo {
- public static void main(String[] args) {
- // !非 真变假,假变真
- System.out.println(!(12 > 21));// 结果为:true
- System.out.println(!true);// 结果为:false
- // ^异或 两操作数一真一假,结果才为真,否则为假
- int x = 18;
- System.out.println(x >= 18 ^ x < 18);// 结果为:true
- System.out.println(x < 18 ^ x == 18);// 结果为:true
- System.out.println(x != 18 ^ x > 18);// 结果为:false
- System.out.println(x == 18 ^ x <= 18);// 结果为:false
- // 逻辑与&、短路与&& 两操作数同真,结果为真,否则为假
- int y = 5;
- System.out.println(y > 5 & y <= 5);// 结果为:false
- System.out.println(y >= 5 && y < 5);// 结果为:false
- System.out.println(y != 5 & y < 5);// 结果为:false
- System.out.println(y == 5 && y <= 5);// 结果为:true
- // 逻辑或|、短路或|| 两操作数同假,结果为假,否则为真
- int z = 2;
- System.out.println(z != 18 | z > 18);// 结果为:true
- System.out.println(z >= 18 || z == 18);// 结果为:false
- System.out.println(z <= 18 | z > 18);// 结果为:true
- System.out.println(z != 18 || z == 18);// 结果为:true
- // 短路与测试
- int i1 = 18;
- System.out.println(i1 != 18 && i1++ > 18);// 结果为:false
- System.out.println("i1:" + i1);// 由于左边条件为false,所以右边的表达式未作判断,i1结果为:18
- int i2 = 18;
- System.out.println(i2 != 18 & i2++ > 18);// 结果为:false
- System.out.println("i2:" + i2);// 左边条件为false,右边依然需要判断,i1结果为:19
- // 短路或测试
- int j1 = 18;
- System.out.println(j1 == 18 || j1++ > 18);// 结果为:true
- System.out.println("j1:" + j1);// 由于左边条件为true,所以右边不作判断,j1结果为:18
- int j2 = 18;
- System.out.println(j2 == 18 | j2++ > 18);// 结果为:true
- System.out.println("j2:" + j2);// 左边条件为true,右边依然需要判断,j2结果为:19
- }
- }
奉上逻辑运算符真值表:
五、位运算符
位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字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编程基础-运算符的更多相关文章
- Java编程基础——运算符和进制
Java编程基础——运算符和进制 摘要:本文主要介绍运算符和进制的基本知识. 说明 分类 Java语言支持如下运算符: ◆ 算术运算符:++,--,+,-,*,/,%. ◆ 赋值运算符:=,+=,-= ...
- Java入门——(1)Java编程基础
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- java编程基础二进制
0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...
- Java编程基础-面向对象(中)
本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...
- Java编程基础——数组和二维数组
Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...
- Java编程基础——流程控制
Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...
- Java编程基础——常量变量和数据类型
Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...
- Java编程基础——标识符和关键字
Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...
随机推荐
- bzoj 4503 两个串 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 推式子即可: 不知怎的调了那么久,应该是很清晰的. 代码如下: #include< ...
- 动态规划专题(一) HDU1087 最长公共子序列
Super Jumping! Jumping! Jumping! 首先对于动态规划问题要找出其子问题,如果找的子问题是前n个序列的最长上升子序列,但这样的子问题不好,因为它不具备无后效性,因为它的第n ...
- java面试编程题
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问 ...
- nodejs 循环的陷阱
Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯 以后就会发现还是很简单的.然而这之中其实暗藏了不少陷阱,一个很容易遇到的问题就是 循环中的回调函数,初学者经常容易 ...
- CF-798C
C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Flutter实战视频-移动电商-06.Dio基础_Get请求和动态组件协作
博客地址: https://jspang.com/post/FlutterShop.html#toc-0ee 编写页面代码 创建动态组件HomePage,原来的代码是静态的我们这里就去掉就可以了. 然 ...
- CCF 201512-1 数位之和 (水题)
问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 20151220的各位数字 ...
- studio 配置 opencv3.1
环境 win10 android studio2.0 OpenCV-3.1.0-android-sdk android-ndk-r10e-windows-x86_64 jdk-8u102-window ...
- 覆盖equals方法时请遵守通用约定
覆盖equals方法时请遵守通用约定 覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...
- mysql之SQL入门与提升(四)——终结篇,函数
一.SQL Aggregate (聚合)函数 SQL Aggregate 函数计算从列中取得的值,返回一个单一的值. AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回 ...