+:
- 加法
- 表示正数的正号:a = +1;
- 字符连接:“Hello” + “world” = “Helloworld”
//只要至少有一个是字符串,+执行的就是字符串的拼接
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
/ and %
/ (丢弃小数部分,只保留整数部分)
%(取余)
int a = 3;
int b = 2;
int c = a / b;
double d = a / b;
double e = 1.0 * a / b;
System.out.println(c); //1
System.out.println(d); //1.0
System.out.println(e); //1.5
单目运算符(++、- -)
a++(输出a,a自加)
++a(a自加,输出a)
赋值运算符(=、+=、*=、%=、/=)
a *= 2 (a = a * 2)
关系运算符(!=、==、<、>、<=、>=)
逻辑运算符
&(与):0 & 0 = 0;0 & 1 = 0;1 & 0 = 0;1 & 1 = 1;
|(或): 0 | 0 = 0;0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1;
!(非):!1 = 0;!0 = 1;
^(异或):0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 1 = 0; 1 ^ 0 = 1;
(相同为false,不同为true)
注意事项:
- && 和 & 都是与运算,但&&比较智能,即当第一个为false时,已经知道结果,后面的就不会执行了;而&是都会执行。
- || 同理;短路效果
位运算(<<、>>、>>> 、&、!、^)
(如果要让操作数变成移位之后的结果,必须进行赋值)
针对变量的二进制位进行运算。
3 << 2 = 12
011 (00000000,00000000,00000000,00000011)
向左移动两位
得:(00000000,00000000,00000000,00001100)= 12
相当于对操作数 * 2;
移动一位*2;
3 * 2 * 2 = 12;
前提:左移之后的结果仍在类型表示范围内
右移
带符号的移位:-2 >> 1
10000000,00000000,00000000,00000010(-2)
11111111,11111111,11111111,11111110(补码)
右移一位,高位补符号位
11111111,11111111,11111111,11111111
取反+1
10000000,00000000,00000000,00000001 (-1)
相当于给操作数 / 2(只针对未溢出且可以被除尽的情况)
3 >> 1 = 1
-1 >> 1 = 1
无符号右移(>>>)
移位动作与带符号数一模一样,右移之后,高位直接填充0;通常处理正整数。
相当于除以2
针对负数无符号右移,不知道会出现什么.
按位取反(~,包括符号位)
~6 = -7;
00000000,00000000,00000000,00000110 (6)
11111111,11111111,11111111,11111001(按位取反)
正常取反+1
10000000,00000000,00000000,00000111 (-7)
交换
a = a + b
b = a - b // b = a + b - b
a = a - b // a = a + b - a
a = a ^ b
b = a ^ b // a ^ (b ^ b) = a
a = a ^ b // a ^ b ^a = a ^ a ^ b = b;
三目运算符
关系表达式?表达式1:表达式2
如果关系表达式的结果为true,则执行表达式1
否则,表达式2