运算符
运算符指明对操作数的运算方式。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
算术运算符
单目:~(按位取反)、! (取非)、-(负号运算符)、 ++(自增)、 - -(自减)、
双目:+ - * / %(取余)
三目(也称为条件运算符):a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;这整个运算符包括一个关系运算符(可以是">""<""!="等等),一个"?",一个":",冒号前后需要有两个表达式或者是值或者是对象。
/*算术运算符:+ - * / % ++ -- * +:加法运算 连接字符串 两个功能 * -:减法运算 * *:乘法运算 * /:除法运算 * %:取余数 * ++:自增运算 * --:自减运算*/ int a = 10; int b = 5; String s1 = "xyz"; String s2 = "opq"; System.out.println(a+b); System.out.println(a+'a'); System.out.println(25+s1); System.out.println(s1+s2); int c = 5; int c1 = c++; System.out.println(c1);//c++ 先进行运算 后进行自增 System.out.println(c); int c2 = ++c; System.out.println(c2);//++c 先进行自增 后进行运算 /* 运行结果: 15 107 25xyz xyzopq 5 6 7*/
/* * 条件运算符 * (条件表达式)?表达式1:表达式2; * 当条件表达式结果为true时,执行表达式1,当条件表达式结果为false时,执行表达式2 */ int x= 85; String result=(x>60)?"及格":"不及格";//使用条件运算符时,输出结果必须是相匹配的数据类型 System.out.println(result); /*运行结果: *及格 */
赋值运算符
= += -= *= /= %=
/* * 赋值运算符: == += -= *= /= %= * =: 赋值运算符 与 == 关系运算符区分 * +=: a += b--->a = a+b * -=: a -= b--->a = a-b * *=: a *= b--->a = a*b * /=: a /= b--->a = a/b * %=: a %= b--->a = a%b */ int a = 10; int b = 25; int c = a += b; int d = a -= 9; int e = b *= 2; int f = b /= 5; int g = b %= 3; System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); System.out.println(g); /*运行结果: * 35 26 50 10 1*/ short s = 4; //s=s+2;报错原因 s为short类型 2为int类型,需要强制转换 s+=2;//s = s+2 +=符号有隐式转换 System.out.println(s); /*运行结果: * 6*/
关系运算符
等于符号:==,不等于符号:!= ,大于符号:>, 小于符号:<,大于等于符号:= ,小于等于符号:<= 。
/* * 关系运算符 == != > < >= <= * == != 数值与数值, 数值与字符,字符串与字符串,逻辑值与逻辑值 * > < >= <= 数值与数值,数值与字符*/ int m = 10; int n = 5; char x = 'a'; String y ="abc"; String z = "def"; System.out.println(m==n); System.out.println(m!=n); System.out.println(m>x); System.out.println(y==z); System.out.println(y!=z); /*运行结果: * false true false false true */
逻辑运算符
与(&)、非(~)、或(|)、异或(^)
&:双目运算符,运算时均把运算数转换为二进制再做比较,规则:当相同的位上均为1时结果为1,否则结 果为0.如:1010&1101,转为二进制:1111110010&10001001101,比较结果为:1000000转为十进制: 64。所以1010&1101=64;
| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110
~:0变1,1变0
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
短路与(&&)、短路或(||)、非(!)
&&:与位运算符&用法相同,只是&在运算时,运算符两边的表达式首先被执行,然后再对两表达式中得到的结果进行与运算,而&&在运算时,如果从左边表达式中得到的操作数能确定运算结果,就不再对右边的表达式进行运算。
||:与位运算符|用法相同,只是&在运算时,运算符两边的表达式首先被执行,然后再对两表达式中得到的结果进行与运算,而||在运算时,如果从左边表达式中得到的操作数能确定运算结果,就不再对右边的表达式进行运算。
采用&&和||的目的是加快运算速度。
/*逻辑运算符:& | ! && || ^ * &与运算 同真为真 * |或运算 有真为真 * !非运算 取反 * &&短路与 A&&B 当A为假时,不执行B,结果为false 当A为真时,执行B,A,B同为真时,结果为true * ||短路或 A||B 当A为真时,不执行B,结果为true 当A为假时,执行B,若B为真,则结果为true,A,B同为假时,结果为false * ^逻辑异或*/ int a = 10; int b = 5; int c = 25; System.out.println(a>b&b<c);//true & true 结果为 true System.out.println(a>b&b==c);// ture & false 结果为 false System.out.println(a>b&++b>c);//A&B A B都执行 b自增1 b此时为6 System.out.println(b); System.out.println(a>c&&++b<c);//A&&B A执行 B不执行 此时b输出结果仍为6 System.out.println(b); System.out.println(a>b||++b>c);//A||B 当A为true B不执行 b不自增 b仍为6 输出结果为true System.out.println(b);
其他运算符
instanceof
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false。
位运算
<< 带符号左移 >>带符号右移 >>> 无符号右移
/*位运算 * <<:左移 * >>:右移 * >>>:无符号右移 * &:与运算 全1出1 * |:或运算 有1出1 * ^:异或运算 相同为0 相反为1 * ~:取反运算 1变0 0变1 */ byte m = 5; byte n = 4; /* * 0000 0101 5 * 0000 0100 4*/ System.out.println(m<<1);//m 左移 0000 1010 10 System.out.println(m>>1);//m 右移 0000 0010 2 System.out.println(m>>>1);//m 无符号右移 0000 0010 2 System.out.println(m&n);//结果为4 /* * 0000 0101 5 * 0000 0100 4 * 0000 0100 4 全1出1*/ System.out.println(m|n);//结果为5 /* * 0000 0101 5 * 0000 0100 4 * 0000 0101 5 有1出1*/ System.out.println(m^n);//结果为1 /* * 0000 0101 5 * 0000 0100 4 * 0000 0001 1 相同为0 相反为1*/ //当只有两个变量时,要求交换两变量的值 int p = 12; int q = 8; p = p^q; q = p^q; p = p^q; System.out.println("p = "+p);//p=8 System.out.println("q = "+q);//q=12 System.out.println(~m);//结果为-6 /* * 0000 0101 5 * 1111 1010 -6 0变1 1变0*/