初识 Java
运算符
目录
1.算数运算符
1.基本运算符:加减乘除模(+ - * / %)
int a = 2;
int b = 1;
system.out.println(a + b);
system.out.println(a - b);
system.out.println(a * b);
system.out.println(a / b);
system.out.println(a % b);//求余数
以上都是二元运算符
注: int/int 结果还是int类型,而且会向下取整
–除
int a = 1;
int b = 2;
System.out.println(a/b);//小数部分不会保存,结果位0
System.out.println(1/0);
运行结果:
以 0 作为除数,编辑器会报出 异常 (异常分为两类: 1.受查异常;2.非受查异常).
这里的 ‘ArithmeticException’ 异常为 算数异常
并给出出错的位置在 第m行.
–模
/* int a = 1;
int b = 2;
System.out.println(a/b);//小数部分不会保存,结果位0
System.out.println(1/0);*/
//多行注释快捷键 : ctrl + shift + /
//单行注释 : ctrl + /
System.out.println(7 % 3);// 1
System.out.println(7 % -3);// 1
System.out.println(-7 % 3);// -1
System.out.println(-7 % -3);// -1
System.out.println(15.5 % 2.0);// 1.5
//在 C语言中 此处会报错,但是在java中此处允许计算.
被模数 < 0 ,则余数 < 0;
被模数 > 0 ,则余数 > 0;
2.增量运算符
//自增运算
int a = 1;
a += 2;//a = a + 2
System.out.println(a);
//不同类型的增量运算
long b = 10L;
int i = 3;
i += b;
System.out.println(i);
在不同类型进行增量运算时,输出会是怎样的?
运行结果:
令人疑惑的是,这里并没有报错
难道这里进行了整型提升?亦或是 截断…
我们可以用以下代码进行核验 是否是进行了提升
byte b1 = 1;
byte b2 = 127;
b2 += b1;
System.out.println(b2);
若打印出了128, 则进行了提升
(提升 :
1.如果参与运算的两个操作数类型不同,那么较低精度的整数类型会被提升为较高精度的整数类型。
例如,将一个int类型的变量与一个short类型的变量相加,那么short类型的变量会被提升为int类型。
2.如果参与运算的操作数有一个是有符号的,另一个是无符号的,那么有符号的操作数会被转换为无符号类型,并且结果也是无符号类型。
例如,将一个有符号的int类型变量与一个无符号的unsigned int类型变量相加,那么有符号的int类型会被转换为无符号类型。)
若不是128, 则进行了截断
(截断指的是当进行不同类型之间的计算或操作时,结果可能会被截断为一种较低精度或较小范围的类型。这通常发生在将一个较高精度或较大范围的值赋给一个较低精度或较小范围的变量时。)
运行结果:
所以 不同类型的增量运算,是发生了截断(存不下了).
3.自增/自减运算符
int a1 = 10;
int a2 = 10;
int b = a1++;
System.out.println(b);
int c = ++a2;
System.out.println(c);
运行结果:
认清 前置++ 与 后置++ 的区别
了解下面的代码
int a = 10;
a = a++;
System.out.println(a);
运算结果:
出人意料,竟然是 10
但是在C语言中,这个程序的答案又为 11.
原因是不同程序的汇编代码不同, 这里不做深入,了解即可.
注:
1.若单独使用,则无差别;
2.若混合使用,增量与赋值的顺序要摸清楚;
3.只有变量才可使用自增/自减,常量不能使用,因为常量不允许被修改.
2.关系运算符
//关系运算符
int a = 10;
int b = 20;
System.out.println(a == b);// false
System.out.println(a != b);// true
System.out.println(a < b);// true
System.out.println(a > b);// false
System.out.println(a <= b);// true
System.out.println(a >= b);// false
关系运算符输出,只有 false 与 true 两种
3.逻辑运算符(重点)
运算结果都为 boolean类型
1.逻辑与 &&
见 假 即 假
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2);//true
System.out.println(a == 1 && b > 100);//false
System.out.println(a > 100 && b == 2);//false
System.out.println(a > 100 && b > 100);//false
短路与
只要表达式1 为假 则不会执行 表达式2
System.out.println(10 > 20 && (10/0 == 0));//这里被短路,则不会出现报错
2.逻辑或 ||
见 真 即 真
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2);//true
System.out.println(a == 1 || b > 100);//true
System.out.println(a > 100 || b == 2);//true
System.out.println(a > 100 || b > 100);//false
短路或
只要表达式1 为真 则不会执行 表达式2
System.out.println(10 < 20 || (10/0 == 0));//这里被短路,则不会出现报错
单个 逻辑与 & 和 逻辑 或 | == && / ||
但不能体现短路与 和 短路或
System.out.println(10 > 20 & (10/0 == 0));//程序异常
System.out.println(10 < 20 | (10/0 == 0));//程序异常
3.逻辑非 !
逻辑非同样 需要 适配上 布尔表达式
int a = 10;
System.out.println(!a);//程序报错
boolean flg = true;
System.out.println(!flg);//false
4.位运算符
1.按位与 &
对应位上是1 则是1
//按位与 &
0101 1011
0011 0101
---------
0001 0001
2.按位与 |
对应位上有1 则是1
//按位或 |
0010 1011
0001 1110
---------
0011 1111
3.按位异或 ^
不一样的地方 则是1(找不同)
//按位异或 ^
0011 1011
0011 0001
---------
0000 1010
可得
n ^ n = 0
0 ^ n = n
例 : 1 ^ 2 ^ 3 ^ 2 ^ 1
解 : 原式 = 1 ^ 1 ^ 2 ^ 2 ^ 3
= 0 ^ 0 ^ 3
=3
按位异或 满足交换律
4.按位取反 ~
如果该位是 0 则转为 1,如果该为是 1 则转为 0.
0110 0101 --> ~
----------
1101 1010
5.移位运算(了解)
左移 : <<
右位补零
0000 1010 << 1 ---> 0001 0100 22 (11*2^1)
0000 1011 << 2 ---> 0010 1100 44 (11*2^2)
右移 : >>
左位补符号位
0000 1011 >> 1 ---> 0000 0101 5 (11/2^1)
0000 1011 >> 2 ---> 0000 0010 2 (11/2^2)
-1:
1111 1111 >> 1 ---> 1111 1111 -1
无符号位右移
最右侧位不要了,最左侧 补 0
-1:
1111 1111 >>> 1 ---> ?
以下代码
int a = -1;
System.out.println(a >>> 1);
运行结果
2147483647
但是没有 无符号左移 : <<<
因为无符号左移和 普通的 左移,没有任何区别,没有意义
6.条件运算符(三目运算符)
表达式1 ? 表达式2 : 表达式3
表达式1 为真 执行 表达式 2,为假 执行 表达式 3
int a = 10;
int b = 20;
int max = a > b ? a : b;
// a > b ? a : b;此代码报错,因为三目运算符不能单独存在
System.out.println(max);//20
boolean flg = true == true ? true : true == false ? false : false;
System.out.println(flg);
表达式
运行结果:
true
boolean flg2 = true == false ? true : true == false ? false : false;
System.out.println(flg2);
运行结果:
false
7.运算符的优先级
想要怎样 加括号即可