1.算术运算符
操作符 | 描述 |
---|---|
+ | 加、求和 |
- | 减、求差 |
* | 乘、求积 |
/ | 除、求商 |
% | 模、求余 |
++ | 自增 |
– | 自减 |
+:
拼接字符串:两端有一端是字符串就表示拼接字符串---结果也是字符串
算术运算:数值
/ :
取商
除数不能为0
5/0=报错 /by Zero Arithmetic Exception,
-5.0/0.0=-Infinity --无限大
0/0=报错,
0.0/0=NaN---not a number
%:
取余数
8%3 = 2;
18%4 = 2;
8.2%3.2 = 1.8?
++和——
++自增运算 a++ //a=a+1;
++在前先自增再用变量
++在后先用变量再自增
--同理
int a = 5;
a = a++;
System.out.println(a); -- 结果是5
javap -verbose TestInc:反编译
反编译后的main方法中执行的虚拟机指令助记符:
0: iconst_5 //加载常量5到栈里
1: istore_1 //把5这个常量弹出栈,存在第一个变量a中
2: iload_1 //把第一个变量a的值入栈
3: iinc 1, 1 //在a变量上自增1
6: istore_1 //把栈中的5弹出到第一个变量a中
//调用静态方法输出a
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
练习:
int a = 5;
a = ++a;
System.out.println(a); -- 结果是6
0: iconst_5
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_1
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
LineNumberTable:
line 12: 0
line 13: 2
line 14: 7
line 15: 14
int a = 8;
int b = (a++)+(++a)+(a*10);
System.out.println(b);//118
0: bipush 8 //常量入栈。。。。。。
2: istore_1
3: iload_1
4: iinc 1, 1
7: iinc 1, 1
10: iload_1
11: iadd
12: iload_1
13: bipush 10
15: imul
16: iadd
17: istore_2
18: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
21: iload_2
22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
25: return
方法运行的时候数据是存在栈里:先进后出----队列:先进先出
2.赋值运算符
操作符 | 描述 |
---|---|
= | 直接赋值 |
+= | 求和后赋值 |
-= | 求差后赋值 |
*= | 求积后赋值 |
/= | 求商后赋值 |
%= | 求余后赋值 |
public static void main(String[] args){
int a = 10; //赋值运算符
a += 5; //在a基础上+5 a = a + 5;
System.out.println(a); // 15
int b = 20;
b -= 3;// b = b - 3;
System.out.println(b); // 17
int c = 30;
c %= 4;// c = c % 4;
System.out.println(c);
}
3.关系运算符
操作符 | 描述 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = input.next();
//String password = input.next();
//记住结论 基本数据类型比较相等用==,字符串相等用.equals()
System.out.println("admin"=="admin");
System.out.println(name);
System.out.println((name=="admin")+"----==");//算术>关系>赋值
System.out.println(name.equals("admin")+"---equals");
}
4.逻辑运算符
&&:两者都为真,结果为真,当第一个值为false的时候短路
&:两者都为真,结果为真,不短路
||:有一个值为真,结果为真,当第一个值为true的时候短路
|:有一个值为真,结果为真,不短路
!:取反
^:相同为假,不同为真
优先级:
!>&&>||
5.三元运算符
操作符 | 语义 | 描述 |
---|---|---|
?: | 表达式?结果1:结果2 | 表达式结果为真,得结果1表达式为假,得结果2 |
结果类型以大的那个结果类型为准:
public static void main(String[] args) {
int num=0;
String gender = num==1?"男":"女";
System.out.println(gender);
int a=5;
System.out.println("a="+((a<5)?10.9:9)); // 9.0
char x='x';
int i=10;
System.out.println(false?i:x); // 120
System.out.println(false?100:x); // x
}
6.位运算
& 、 |、 ^ 、 <<、 >>、 >>>
和逻辑运算的区别:
boolean是逻辑
数值是位运算
7.运算时的类型转换
- 进行算数运算时:
- 两个操作数有一个为double,计算结果提升为double。
- 如果操作数中没有double,有一个为float,计算结果提升为float。
- 如果操作数中没有float,有一个为long,计算结果提升为long。
- 如果操作数中没有long,有一个为int,计算结果提升为int。
- 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int。
[注意:任何类型与String相加(+)时,实为拼接,其结果自动提升为String。](