算术运算符
对变量进行运算的
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +7 | 7 |
- | 负号 | b=11;-b | -11 |
+ | 加号 | 10+1 | 11 |
- | 减号 | 10-8 | 2 |
* | 乘号 | 7*8 | 56 |
/ | 除号 | 9/3 | 3 |
% | 取模(取余) | 11%9 | 2 |
++ | 自增(前):先运算在取值 | a=2; b=++a; | a=3;b=3 |
++ | 自增(后):先取值在运算 | a=2;b=a++; | a=3;b=2 |
-- | 自减(前):先运算后取值 | a=2;b=--a; | a=1;b=1 |
-- | 自减(后):先取值后运算 | a=2;b=a--; | a=1;b=2 |
+ | 字符串相加 | "ni"+"hao" | "ni hao" |
在%的本质上看一个公式 a % b = a - a / b * b
//自增
int j = 8;
int k = ++j; // 等价 j = j+1; k = j; 先计算后赋值
System.out.println("k="+k+"\n"+"j="+j);
// 输出 k=9
//j = 9
int a = 9;
int b = a++; // 等价 b = a; a = a + 1; 先赋值,后计算
System.out.println("a="+a+"\n"+"b="+b);
//输出 a = 10
// b = 10
关系运算符
关系运算符的结果都是boolean型,要么是true,要么是False;
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 8==7 | false |
!= | 不等于 | 8!=7 | true |
< | 小于 | 8<7 | false |
> | 大于 | 8>7 | true |
<= | 小于等于 | 8<=7 | false |
>= | 大于等于 | 8>=7 | true |
instanceof | 检查是否是类的对象 | "hsp"instanceof String | true |
逻辑运算符
短路与&&,短路或||,取反!
逻辑与&,逻辑或|,逻辑异或^
A | B | A&B | A&&B | A|B | A||B | !A | A^B | |
---|---|---|---|---|---|---|---|---|
true | true | true | true | true | true | false | false | |
true | false | false | false | true | true | false | true | |
false | true | false | false | true | true | true | true | |
false | false | false | false | false | false | true | false |
a&b:当a和b同为true,则结果为true,否则为false;
a&&b:当a和b同时为true,则结果为true,否则为false;
a|b:当a和b,有一个为true,则结果为true,否则为false;
a||b:当a和b,有一个为true,则结果为true,否则为false;
!a:当a为true,则结果为false,当a为false时,则结果为true;
a^b:当a和b不同时,则结果为true,否则为false;
&& 和 &的区别
&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高;
&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低;
int a = 4;
int b = 5;
if(a > 6 && ++b < 5){
System.out.println("执行成功!!");
}
System.out.println("a=" + a + " " + "b=" + b); // a = 4, b = 5;
if(a > 6 & ++b < 5){
System.out.println("执行成功!!");
}
System.out.println("a=" + a + " " + "b=" + b); // a = 4, b = 6;
||和|的区别
||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为true,效率高;
|逻辑或:不管第一个条件是否为true,则第二个条件都要判断,效率低;
取反! 和逻辑异或^
// 取反!
System.out.println(60>20); // true
System.out.println(!(60>20)); // false
// a^b 逻辑异或,当a和b不同时,则结果为true,否则为false
boolean b = (10 > 1) ^ (3 < 5); // 第一个为成立所以为真,第二个成立所以为真,
//两个都为真,相同,所以false
System.out.println("b="+""+b); // b=false
赋值运算符
基本赋值运算符: = int a =10;
复合赋值运算符:
+=, -=, *=, /=, %=
a += b 等价于:a = a + b;
注意:复合运算符会进行类型转换
//复合运算符会进行类型转换
byte b = 3;
b += 2; //等价于 b = (byte)(b+2)
三元运算符
基本语法:
条件表达式? 表达式1 : 表达式2;
如果条件表达式为true,运算后的结果是表达式1;
如果条件表达式为false,运算后的结果为表达式2;
//三元运算符
int a = 10;
int b = 99;
int result = a>b ? a++ : b--; // 解读: 1、 a>b 为 false 2、返回b--,先返回b的值,然后在b-1
System.out.println(result); // 99
细节:
表达式1和表达式2要为可以赋给接受变量的类型(或可以自动转换/或者强制转换);
//表达式1和表达式2要为可以赋给接受变量的类型(或可以自动转换/或者强制转换)
int a = 3;
int b = 4;
int c = a > b ? 1.1 : 3.4; //错误的,其中1.1和3.4是double类型的,而最后要赋值给int类型,所以不对;
int c = a > b ? (int)1.1 : (int)3.4; // 正确,通过强制类型转换,把double 类型转换为int类型,可行;
double c = a > b ? a : b + 4; // 正确,通过修改声明变量类型,他就自动类型转换了,
// a和b是int,int转double可行;
三元运算符可以转换为if-else;
运算符优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序;
只有单目运算符、赋值运算符是从右向左运算的;
. () {} ; , | |
---|---|
R ->L | ++ -- ~ !(data type) ----> 单目运算符 |
L->R | * / % |
L->R | + - |
L->R | << >> >>> 位移 |
L->R | < > <= >= instanceof |
L->R | == != |
L->R | & |
L->R | ^ |
L->R | | |
L->R | && |
L->R | || |
L->R | ? : |
R ->L | == *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |= |
优先级从高到低的!!!
-
()、{}等
-
单目运算符++ --
-
算术运算符
-
位移运算符
-
比较运算符
-
逻辑运算符
-
三元运算符
-
赋值运算符