文章目录
《JAVASE系列》运算符详解
🍎前言前语:
本章重点讲解java语言中的运算符,并且会讲解java语言如何输入。
参考书籍:《java核心技术卷1》
你若盛开,清风自来。
1. java 的 输入
在java中,使用java输入包Scanner来做到输入。
代码示例:
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String ac = scanner.nextLine();
int a = scanner.nextInt();
double b = scanner.nextDouble();
float c = scanner.nextFloat();
long d = scanner.nextLong();
System.out.println(ac);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
输入内容,可以很好地运行代码
在oj题目中也会有多组输入,以下是多组输入的语法格式,比如为上面的代码实现多组输入
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String ac = scanner.nextLine();
int a = scanner.nextInt();
double b = scanner.nextDouble();
float c = scanner.nextFloat();
long d = scanner.nextLong();
System.out.println(ac);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
}
这样就能在oj题目中实现多组输入了。
结果如下:
这样的话就可以继续输入了。
2. java的算术运算符
2.1 基本四则运算符:
加减乘除模(+ - * / %)
代码示例:
public class test {
public static void main(String[] args) {
int a = 40;
int b = 20;
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,结果会舍弃小数部分
例如:
public class test { public static void main(String[] args) { int a = 10; int b = 6; System.out.println("a / b 的结果是"+(a / b)); }
想要得到数学结果,可以用double类型接受。
public class test { public static void main(String[] args) { int a = 10; int b = 6; double c = (a*1.0) / b; System.out.println("a / b 的结果是"+c); }
值得注意的是:
如果仅仅的使用double去接收两个int类型的计算结果时,输出的结果也是int类型的。
public class test { public static void main(String[] args) { int a = 10; int b = 6; double c = a / b; System.out.println("a / b 的结果是" + c); } }
所以我们可以将一个int类型强制转换成double类型,这样另一个int类型的变量也会得到类型提升,算出来的结果存放在double类型中,就是数学结果了。
-
做除法和取模时,右操作数不能为0
public class test { public static void main(String[] args) { int a = 1; int b = 0; System.out.println(a / b); } }
public class test { public static void main(String[] args) { int a = 1; int b = 0; System.out.println(a % b); } }
-
% 不仅可以对整形取模,也可以对double类型取模,但是没有意义,一般都是对整形取模的
public class test { public static void main(String[] args) { double a = 11.5; double b = 2.0; System.out.println(a % b); } }
-
两侧操作数类型不一致时,向类型大的提升
public class test { public static void main(String[] args) { int a = 10; double b = 20; double c = 0; c = a + b; System.out.println(c); } }
public class test { public static void main(String[] args) { int a = 10; double b = 20; int d = 0; d = a + b; System.out.println(d); } }
可以得出结论:int + double 的结果是 double类型的。
2.2 增量运算符:
代码示例:
+= -= *= /= %=
public class test {
public static void main(String[] args) {
int a = 4;
int b = 2;
int c = 0;
System.out.println(a += b);
//相当于a = a + b
System.out.println(a -= b);
//相当于a = a - b
System.out.println(a /= b);
//相当于a = a / b
System.out.println(a *= b);
//相当于a = a * b
System.out.println(a %= b);
//相当于a = a % b
}
}
结果如下 可以自己先计算下看与编译器是否相同
注意:
增量运算符会导致左操作数的数值增加,右操作数不变,所以完成自增计算时要记得左操作数变量的值已经发生改变,如上面的代码,变量 a 在经过每一次运算过后的值都已经发生了改变。
3. java的关系运算符
注意:关系运算符在使用过后得到的类型是boolean类型的。与c语言的不同。
== != < > <= >=
代码示例:
public class test {
public static void main(String[] args) {
int a = 10;
int b = 20;
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);
System.out.println(a<=b);
}
}
运算结果:
同时要注意需要多次判断时,切忌连着写,在java当中是不符合语法规则的,会报错。
4. 逻辑运算符
4.1 逻辑与 &&
相当于生活中的且,必须同时满足两个条件。
public class test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
System.out.println(a<b&&a==c);
// 真 真 = 真
System.out.println(a>b&&a==c);
// 假 真 = 假
System.out.println(a<b&&a>c);
// 真 假 = 假
System.out.println(a>b&&a>c);
// 假 假 = 假
}
}
运行结果:
4.2 逻辑或 ||
相当于生活中的或,两个条件只需满足一个即可
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
System.out.println(a<b||a==c);
// 真 真 = 真
System.out.println(a>b||a==c);
// 假 真 = 真
System.out.println(a<b||a>c);
// 真 假 = 真
System.out.println(a>b||a>c);
// 假 假 = 假
}
}
运行结果:
4.3 逻辑非
真变假,假变真
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(!(a>b));
//a>b为假 ,!(a>b) 即为真
System.out.println(!(a<b));
//a<b为真,!(a>b) 即为假
}
}
运行结果:
4.4 短路求值
概念:
- 对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
- 对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
- & 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && 和 || 相比, 它们不支持短路求值.
代码示例:
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println((a>b)&&(a/0==0));
System.out.println((a<b)||(a/0==0));
}
}
运行结果:
任何数字都是不可以除以0的,但是编译器并没有发生报错。
这是因为逻辑与&&在判断第一个为假时,便不再判断第二个,返回了假,只有当第一个为真,才会去判断第二个。
同时对于逻辑或||来说,第一个为真时,便不会判断第二个,返回了真,只有当第一个为假,才会去判断第二个。
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println((a>b)&(a/0==0));
System.out.println((a<b)|(a/0==0));
}
}
运行结果:
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算,但是它们并不会如&& 与 ||支持短路求值,也就是说会按照顺序进行判断。
5.位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.
5.1按位与 &
语法规则: 左操作数与游操作数的二进制对应位都为1时,所得到的结果的对应二进制位才为1,否则为0。
代码讲解:
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a&b);
}
}
运行结果:
画图理解:
5.2按位或 |
语法规则:如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
代码解释:
public class test{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a|b);
}
}
运行结果:
画图解释:
5.3按位异或 ^
语法规则:对应的二进制位的数字相同所得到的二进制位结果为0,不同为1
代码解释:
public class test {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a ^ b);
}
}
运行结果
画图解释:
5.4按位取反 ~
语法规则:如果该位为 0 则转为 1, 如果该位为 1 则转为 0
public static void main(String[] args) {
int a = 0xffffffff;
System.out.printf("%x\n", ~a);
}
}
运行结果:
0xffffffff表示二进制位
11111111111111111111111111111111
画图解释:
6. 移位运算(了解)
移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
6.1 左移 <<:
语法规则: 最左侧位不要了, 最右侧补 0.
运算小技巧:移位一位相当于乘以2。
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数。
代码解释:
public class test {
public static void main(String[] args) {
int a = 0x10;
System.out.printf("%x",a<<1);
}
}
运行结果:
注意结果是以16进制打印的:
6.2右移 >>:
语法规则:最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
运算小技巧:移位一位相当于除以2。
public class test {
public static void main(String[] args) {
int a = 0x10;
System.out.printf("%x",a>>1);
}
}
运行结果:
6.3 无符号右移 >>>:
语法规则:最右侧位不要了, 最左侧补 0.
public class test {
public static void main(String[] args) {
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
}
}
运行结果:
7.条件运算符
只有一个,也叫三目操作符
语法规则:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
代码解释:
public class test {
public static void main(String[] args) {
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
}
}
运行结果:
8.运算符的优先级
其实运算符的优先级是比较难去记忆的,如果我们在不知晓多个操作符混合运算的优先级,我们可以通过加上括号去达到我们想要的运算顺序。
不必强行记忆。
总结:
运算符的细节还是很多的,我们其实只要注意返回的类型以及不确定其优先级的时候将其用括号括起来,得到我们想要的运算顺序即可。
本章到此结束,感谢阅读完,如有错误请私信,万分感谢能指出我的错误!
与君共勉!