运算符
对常量和变量进行操作的符号称为运算符。
运算符的分类:
- 算术运算符: +, - , * , / , % , ++ , –
- 赋值运算符: =, +=,-=,*=,/=,%=
- 比较运算符: == ,!= , < , > , <= , >= , instanceof(后面讲解)
- 逻辑运算符: &(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
- 位运算符: &(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
- 三目运算符: (关系表达式) ? 表达式1 : 表达式2;
运算符的优先级(从高到低)——如果在程序中,要改变运算顺序,可以使用()
括号 ()、[]
正负号 +、-
自增自减,非 ++、–、!
乘除,取余*、/、%
加减 +、-
移位运算 <<、>>、>>>
大小关系 >、>=、<、<=
相等关系 ==、!=
按位与 &
按位异或 ^
按位或 |
逻辑与 &&
逻辑或 ||
条件运算 ?:
赋值运算 =、+=、-=、*=、/=、%=
位赋值运算 &=、|=、<<=、>>=、>>>=
算术运算符
+, - , * , / , % , ++ , –
- 注意事项:
a:整数相除只能得到整数。如果想得到小数,请使用浮点数
b:/获取的是除法操作的商,%获取的是除法操作的余数。 %运算结果的符号,取决于参与运算是左边的符号
//运算符:对常量或变量进行操作的符号
//数学运算符,比较运算符,逻辑运算符,三目运算符,位运算符 ,赋值运算
//算数运算符有哪些 + , - , * , / , % , ++ , --
int a=10;
int b=3;
System.out.println(a/b); //3 /取商 两个整数相除,结果的商 整数相除只能得到整数
System.out.println(a%b);//1 %取余数 余数为1
int a=10;
int b=3;
System.out.println(a/b*1.0);//输出为3.33333 //*1.0表示为提升为double类型
++,–运算符:
++:自加。对原有的数据进行+1
–:自减。对原有的数据进行-1
a:单独使用:
放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
b:参与运算使用:
放在操作数的前面,先自增或者自减,然后再参与运算。++1
放在操作数的后面,先参与运算,再自增或者自减。1++
// ++ 自增1 -- 自减1
int i=1;
//++ -- 单独使用,放在前面和放在后面没有区别
i++; //自身+1 //i变为2
++i;
i--;
--i;
// ++ -- 混合使用
int i=1;
int j=++i; //混合使用 ++ -- 在前 先运算 后使用//i=2 j=2
int h=i--;// ++ -- 在后 先使用 后运算//h=2 i=1
System.out.println("i的值是:"+i); // 1
System.out.println("h的值是:"+h);// 2
System.out.println("j的值是:"+j); // 2
+除了有相加的意思,有的时候,还会作为一个连接符
+运算的两端,只要任意一端,为一个字符串,就会起拼接的作用,将两端的内容拼接起来形成一个新的字符串
char ch1='a';
char ch2='b';
int r=ch1+ch2; //r为195 //+ 起一个相加的作用
int a=10;
int b=20;
int num=a+b;
System.out.println("2"+num+"1"); //"2301"
System.out.println(10+20+"0");//"300" //运算从左往右进行
System.out.println("0"+10+20+"0");//"010200"
System.out.println("hello" + 'a' + 1); // "helloa1"
System.out.println('a' + 1 + "hello"); // "98hello"
System.out.println("5+5="+5+5); //"5+5=55"
System.out.println(5+5+"=5+5"); //"10=5+5"
赋值运算符
=, +=,-=,*=,/=,%=
- 注意事项:
a:基本的赋值运算符:=
把=右边的数据赋值给左边。
b:扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。
c: 赋值运算符要求左边的数据必须是一个变量
//赋值运算符有哪些 =, +=,-=,*=,/=,%=
int a=10;//把右边的常量10 赋值给左边int类型的变量a
a=a+10; //a为20 //从右往左
a+=10;//等价于 a=a+10 //+= 累加 //+= 把左边和右边做加法 然后赋值给左边
byte a=10;
a=(byte)(a+120);//强制类型转换
System.out.println(a);
byte b=10;
b+=120; // += 自动会强制类型转换 不会报错
System.out.println(b);
关系运算符
== ,!= , < , > , <= , >= , instanceof(后面讲解)
- 注意事项:
无论你的操作是简单还是复杂,结果是boolean类型。
“==“不能写成”=”。
//关系运算符有哪些 == ,!= , < , > , <= , >= , instanceof(后面讲解)
// = 和 == 区分 ; 比较两个数据是否相等 用 ==
// 比较运算符的运算结果 是boolean —— true 或 false
int a=10;
int b=20;
boolean r=a==b; //false
r=a>b; //false
r=a<b; //true
r=a<=b;//<= 为 <或=
r=a!=b;//!= 为 不等于
逻辑运算符
&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
- 注意事项:
a:逻辑运算符一般用于连接boolean类型的表达式或者值。
在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。
算术表达式:a + b
关系表达式:a == b
&逻辑与:有false则false。
|逻辑或:有true则true。
^逻辑异或:相同为false,不同为true。举例:情侣关系。男男,男女,女男,女女
!逻辑非:非false则true,非true则false。特点:偶数个不改变本身。
//逻辑运算符 & | ! || &&
// &(并且) , |(或者), !(非) , ^(异或) , &&(短路与) , ||(短路或)
//逻辑运算符的运算结果是布尔类型
int a = 20;
int b = 100;
//&的两端只要任意一端为false 那么最终结果就是false 只要两端都为true 其最终结果才为true
boolean r = a > 10 & b < 10;// true & false 为 false
//| 的两端只要任意一端为true 其最终结果都是true 只有两端都为false 其最终结果才是false
r = a > 10 | b < 100;// true | false 为 true
// ^(异或) 相同为false 不同为true // 男男 女女 false 男女 女男 true
boolean flag = true ^ true;//true ^ true 为 false
flag = false ^ true;//false ^ true 为 true
// ! 取反 true变false false 变true
System.out.println(!(1 > 0));//!(true) 为 false
- &&和&的区别?
a:最终结果一样。
b:&&具有短路效果。左边是false,右边不执行。 - ||和|的区别?
a:最终结果一样。
b:||具有短路效果。左边是true,右边不执行。
(开发中常用 &&,||,!)
// &(并且) , |(或者), 和 &&(短路与) , ||(短路或) 的区别
// & 和 && 他们两个运算的最终结果没有任何区别,区别在于运算效率上
int a=1;
int b=2;
boolean flag=a==1&(b++)>2;//true & false(++在后边 先运算 再自加) 为 false
System.out.println(flag);//false
System.out.println(b);//3
//& 他的两端都会去运算
//&& 左端为false 右端就不运算了 当然你左端为true了那右端,还必须运算
flag=a>1&&(b++) > 2;//左端a>1为false 结果为false 不计算右端了 此式子中(b++)不进行
System.out.println(flag);//false
System.out.println(b);//3
// | 和 || 最终的运算的结果没有区别,区别只是效率上的
int num1=10;
int num2=20;
// | 两端都会运算
// || 当他左端为true了右端就不运算了,只有左端为false时右端就得运算一下
boolean f=num1==10||++num2>20;//左端为true 右端不运算
System.out.println(f);//true
System.out.println(num2);//20
位运算符
&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意事项:位运算是直接对二进制补码进行运算。
&:有0则0
|:有1则1
^:相同则0,不同则1
~:按位取反 0变1 1变0
<<:左移 空位补0,被移除的高位丢弃。
>>:右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
>>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
//位运算符:了解 直接对补码进行运算,运算效率比较高
// &(与),|(或),^(异或), ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
byte a = 3; //
byte b = 5; //
// 0 0000011 3的补码
// 0 0000101 5的补码
// --------------------------------------------
System.out.println(a & b);//为0; 0000000 // & 有0则0
System.out.println(a | b);//为7; 0000111 // | 有1则1
System.out.println(~3);//为—4;1 1111100为3按位取反后 的补码转化为原码后就是—4//~按位取反
//<<:左移 空位补0,被移除的高位丢弃。
//>>:右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
//>>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
System.out.println(3 >> 2); //为0//把3右移2位 00 0 00000
System.out.println(3 >>> 2); //把3右移2位 00 0 00000
System.out.println(-3 >> 2); //为-1
^ : 一个数据被另一个数据位异或两次,该数本身不变。 自己位异或自己是0 8^8 结果是0
<<: 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
>> 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5
// 结论:一个数 被另一个数位异或两次该数不变
System.out.println(2 ^ 3 ^ 3);//为2
System.out.println(2 ^ 5 ^ 2);//为5 //5被2位异或两次
System.out.println(10 ^ 10);//为0 //自己和自己位异或 为0
//<< :把 << 左边的数据乘以2的移动次幂 例如 10 << 3 结果 10 * 2 ^ 3 = 80
//>> :把 >> 左边的数据除以2的移动次幂 例如 40 >> 3 结果 40 / 2 ^ 3 = 5
System.out.println(2 * 4);//为8
System.out.println(2 << 2);//为8 //位运算符2<<2比2*4效率更高
三元运算符
三元(三目)运算符的格式
(关系表达式) ? 表达式1 : 表达式2;
int a=(10>20)?30:50; //a=50
三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1;
如果为false,运算后的结果是表达式2;
//三元运算符
//格式: 表达式?结果1:结果2
//看表达式的结果是true 返回结果1 是false 返回结果2
int a=100;
int b=200;
int r=a>b?a:b;
System.out.println("最大值是:"+r);//最大值是:200
// 获取三个数的最大值
int a=10;
int b=2;
int c=900;
int max1=a>b?a:b;
int max=max1>c?max1:c;
//写成一个式子的话 max= (a > b ? a : b) > c ? (a > b ? a : b) : c; 阅读性不好
System.out.println("最大值是"+max); //最大值是900