Java 语言基本语法(运算符)
Java 语言基本语法(运算符)
在 Java 语言中 运算符分为:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三元运算符
1. 算术运算符
(正)+ (负)- + - * / % (前)++ ++(后) (前)-- --(后)
// 注: 取模运算 结果的符号与被模数相同(开发中经常用被取模符号判断能否被除尽的情况)
int number1 = 12;
int numberOne = 5;
System.out.println("number1 % numberOne = " + number1/numberOne);// 2
int number2 = -12;
int numberTwo = 5;
System.out.println("number2 % numberTwo = " + number2/numberTwo);// -2
int number3 = 12;
int numberThree = -5;
System.out.println("number3 % numberThree = " + number3/numberThree);// 2
int number4 = -12;
int numberFour = -5;
System.out.println("number4 % numberFour = " + number4/numberFour);// -2
/*
(前)++ ++(后)
i++ 先运算 再自增
++i 先自增 然后再运算
*/
int a1 = 10;
a1++;// ++a1 ---> 11
System.out.println(a1);// 11(因为在上面已经执行了语句(a1++/++a1)无论先赋值后运算还是先运算后赋值 语句已经执行完成 ---> 代表已经自增完成)
// 注意点!
short s1 = 10;
// s1 = s1 + 1;// 编译失败(因为容量小于 int 类型的在做运算的时候 结果会自动转换为 int 类型)
s1++;// 自增不会改变变量本身的数据类型
System.out.println(s1);// 11
// 问题:
byte b1 = 127;// byte(-127~128)
b1++;// 编译能通过 因为自增不改变数据类型
System.out.println(b1);// -128 因为(127 ---> 01111111 进位 + 1 ---> 10000000(-128))
/*
(前)-- --(后)(同理)
i++ 先运算 再自减
++i 先自减 然后再运算
(自减自加再结束语句后 一定会进行了自减或者自加)
*/
int a4 = 10;
int b4 = --a4;// 先自减 再运算 (--a4/a4自减 = 9)b4 = 9|a4 本身因自减也是9
System.out.println("a4 = " + a4 + "b4 =" + b4);// a4 = 9/b4 = 9
2. 赋值运算符
= (+= -= *= /= %= 这几种写法不会改变数据本身的数据类型)
// 赋值符号
int i1 = 10;
// 连续赋值
int i2,i3;
i2 = i3 = 11;
int i4 = 10, i5 = 11;
// += 其余同理
int num1 = 10;
num2 += 10;// num2 = num2 + 10;
// 但是上面两个式子是有区别的
System.out.println(num2);
// eg:
short s1 = 10;
// s1 = s1 + 10;// 编译失败 小于 int 容量的数据类型 在做运算的时候结果自动转换为 int 类型
s1 += 10;// 编译通过 这种写法不会改变变量本身数据类型
System.out.println(s1);
3. 比较运算符
== != > < >= <= instanceof
注:
-
比较运算符的结果是布尔类型
-
< >= <= 只能用在数值类型之间
-
== != 不仅可以用在数值类型之间 还可是使用在引用类型之间
4. 逻辑运算符
逻辑运算符只能适用于布尔类型(区分逻辑运算符和位运算符 取决于操作的数据类型 逻辑运算符操作的都是布尔类型的变量)
| & ! && || ^_(逻辑异或 相同 False 不同 True)
/*
区分 & 和 &&(逻辑与和短路与)
因为短路与“&&” 只要左边先遇见 False 直接短路 不会执行后方(num2++)
相同点:
1. &/&& 运算结果相同
2. 当符号左边是 true 时 而这都会执行右边的运算
不同点:
1. 当左边是 false "&"会继续执行右边的运算 "&&"因为短路所以不再执行
在开发中推荐使用短路状态
*/
boolean b1 = false;
int num1 = 10;
if (b1 & (num1++ > 0)) {
System.out.println("True");
} else {
System.out.println("False");
}
System.out.println(num1);// 11
boolean b2 = false;
int num2 = 10;
if (b2 && (num2++ > 0)) {
System.out.println("True");
} else {
System.out.println("False");
}
System.out.println(num2);// 10
/*
区分 | 和 ||(逻辑或和短路或)
同理于逻辑与和短路与 但是逻辑或和短路或的区别在于 当左边是 true 的时候 "||"短路或就会短路 不会再执行右边的运算 而"|"逻辑或会继续执行右边的运算
在开发中 推荐使用短路状态(逻辑系列两边都会执行 但是短路系列 若左边符合条件 只会执行左边)
*/
5. 位运算符
- "<<" 左移运算符
- ">>" 右移运算符
- ">>>" 无符号右移运算符(无"<<<")
- "&" 与运算 "|" 或运算 "^" 异或运算 "~" 取反运算
- 注意:位运算符能够运算的是整数
/*
1. <</>> 左右移动
eg: 21
0001 0101
21 << 2
0101 0100
----------
84
方式:左移相当于在右边的位上面补充"0/1" 右移相当于在左边的位置上补充"0/1"(原最高位是0 全部使用0补充 原最高位是1 全部使用1补充)
结论:位运算符操作的都是整型数据 对于左移来说 在一定范围内每向左移动一位 相当于在原数基础上乘以2
在一定范围内每向右移动一位 相当于在原数基础上除以2(左右移动 n 位 就是在原基础上 乘/除 2^n)
eg: 古老的面试题 ---> 最高效的方式计算2 * 8!
2 << 3 或者 8 << 1
2. >>> 无符号右移
不管原数正负 左边都使用0补充 言外之意:原数是负数 无符号右移一位 原数变为正数
3. & | ^ ~
由底层二进制计算
eg:
0000 1100 ---> 12
& 0000 0101 ---> 5
------------------------------
0000 0100 ---> 4
与:两个必须都是1 ---> 1 否则是0
0000 1100 ---> 12
| 0000 0101 ---> 5
------------------------------
0000 1101 ---> 13
或:两个其中一个是1 ---> 1 否则是0
0000 1100 ---> 12
^ 0000 0101 ---> 5
------------------------------
0000 1001 ---> 9
异或:相同为0 不同则是1
0000 0110 ---> 6
------------------------------
~ 1111 1001 ---> -7
取反:就是原数二进制全部取反(包含符号位)(~-7(-7取反)---> 互为取反变为原数)
*/
int m = 12;
int n = 5;
System.out.println("m & n:" + (m & n));// 4
System.out.println("m | n:" + (m | n));// 13
System.out.println("m ^ n:" + (m ^ n));// 9
6. 三元运算符(三目运算符)
-
结构:(条件表达式)?表达式1:表达式2
-
说明:
- 条件表达式的结果是布尔类型
- 根据条件表达式真假 决定执行表达式1或者表达式2
- 条件表达式 == true ---> 执行表达式1
- 条件表达式 == false ---> 执行表达式2
- 表达式1/2要求统一为一个类型 因为需要一个结果去统一接收 eg:(m > n)? "m" : n;// 编译错误
- 三元运算符可以嵌套使用
- 凡是可以使用三元运算符的地方都可以改写为 if-else 反之则不行 ---> 说明3
- 如果程序既可以使用三元运算符又可以使用 if-else 优先使用三元运算符 原因:简洁 执行效率高 毕竟只是一个运算符... .. .
// 获取两个数中的较大值
int m = 12;
int n = 5;
int max = (m > n)? m : n;
System.out.println(max);
//三元运算符可以嵌套
String max1 = (m > n)? "m" : (m == n)? "m == n" : "n";
System.out.println(max1);
// 获取三个数的最大值
int n1 = 12;
int n2 = 30;
int n3 = -43;
int max2 = (n1 > n2)? n1 : n2;
int max3 = (max2 > n3)? max2 : n3;
System.out.println(max3);
// If-Else
if (m > n){
System.out.println(m);
} else {
System.out.println(n);
}
/*
运算符的优先级
凡是想早运算直接加"()"
*/
简单练习
/*
随意给出整数 打印它的个位数 十位数 百位数的值
*/
Scanner input = new Scanner(System.in);
System.out.println("请输入三位数整数!");
int number = input.nextInt();
int individual = number % 10;
int ten = number /10 % 10;
int hundred = number / 100;
System.out.println("个位:" + individual);
System.out.println("十位:" + ten);
System.out.println("百位:" + hundred);
浙公网安备 33010602011771号