目录
从功能角度分,Java中的运算符可以分为:
算数运算符、赋值运算符、 比较运算符、逻辑运算符、位运算符、三元运算符
运算符既可以对变量进行运算,也可以对常量进行运算,被运算的数据称作操作数
int a=13;
int b=5;
int c=a+b; //a与b都是操作数
1、算术运算符
算术运算符用来对操作数进行数学运算
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +31 | 31 |
+ | 加 | 5+5 | 10 |
+ | 连接字符串 | “中软”+“国际” | “中国国际” |
- | 负号 | int a=43;-a | -43 |
- | 减 | 3-1 | 2 |
* | 乘 | 2*3 | 6 |
/ | 除 | 5/5 | 1 |
% | 取模 | 5%5 | 0 |
++ | 自增 | a=2; b=++a;(自增前) a=2; b=a++;(自增后) | a=3;b=3; a=3;b=2; |
-- | 自减 | a=2 b=--a;(自减前) a=2; b=a--;(自减后) | a=1;b=1; a=1;b=2; |
Scanner是一个工具类,主要目标是简化文本的扫描,最常使用此类获取控制台输
Scanner获取控制台输入的步骤
1、使用控制台输入创建Scanner对象:Scanner scanner=new Scanner(System.in);
2、调用Scanner中的nextXXX方法,获得需要的数据类型
例如:next、 nextLine、nextInt、nextByte等
int a = 5 ; a = a++ + ++a + ++a +(a+1);请问a 的输出结果?5+7+8+9= 29
2、赋值运算符
Java中的赋值可以使用普通的=进行赋值;也可以=与其他运算符一起进行复合赋值,即运算后赋值;
int a = 3;
a+=5; //等同运算a=a+5;
short s = 3;
s=s+2; //报错,short类型运算结果 是int类型
s+=2; //编译器优化,通过反编译看出 代码如short s = (short)(s + 2);
//有什么区别?
//赋值运算符
public class AssigningOperator {
public static void main(String[] args) {
// int a=5;
// int a=5;
// a+=5;
// int a=5;a-=5;
// int a=5;a*=5;
// int a=5;a/=5;
int a=5;a%=5;
System.out.println(a);
// int a = 3; a+=5;
// a=a+5;
// short s = 3;
// s=s+2; //编编译错误
// s+=2; // 反编译会发现其实执行的是:s=(byte)(s+2) 所以不会编译出错
}
}
3、比较运算符
比较运算符又叫关系运算符,用来运算两个操作数的大小关系,返回值是true或false;
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 3<=3 | false true |
>= | 大于等于 | 4>=3 3>=3 | true true |
注意:1.==与!=比较基本数据类型是比较值,比较引用类型是虚地址
2.除了== !=外,都只能比较基本数据类型
//比较运算符
public class CompareOperator{
public static void main(String[] args) {
// == 和!= 基本数据类型:比较值(二进制) 引用数据类型:比较地址
int a = 10;
int b = 10;
System.out.println(a==b); //== 比较二进制 true
int c = 13;
int d = 14;
System.out.println("c>d:"+(c>d)); //false
System.out.println("c<d:"+(c<d)); //true
System.out.println("c>=d:"+(c>=d)); //false
System.out.println("c<=d:"+(c<=d)); //true
System.out.println("c==d:"+(c==d)); //false
System.out.println("c!=d:"+(c!=d)); //true
// == 比较基本数据类型比较的是二进制 0.3 0.6 1.2 。2.4 64 32
// double 0.000000...00001 f 0.00....001
// 0.01 == 0.01 true
System.out.println(0.3==0.3f); // false
System.out.println(0.5==0.5f); // true
System.out.println(1.1-0.9);
// == 比较基本数据类型比较的是二进制 0.3 0.6 1.2 。2.4 64 32
// double 0.000000...00001 f 0.00....001
// 0.01 == 0.01 true
double d1 = 0.3; //64
float d2 = 0.3f; //32
System.out.println(d1 == d2); //false
double d3 = 0.5;
float d4 = 0.5f;
System.out.println(d3 == d4); //true
}
}
4、逻辑运算符
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
& | 与 | false&true | false |
或 | false | ||
^ | 异或 | false^true true^true false^false | true false false |
! | 非 | !true | flase |
&& | 双与(短路) | false&&true | false |
双或(短路) | false |
- 注意:&和 && 的不同,| 和|| 的不同**
- 逻辑运算中的与和或运算都分别有两个,&和&&以及|和||
- &和|称为非短路逻辑运算;&&和||称为短路逻辑运算;
- 如果存在T1&T2,当T1为false时,返回值已经确定为false,但是依然还会运算T2表达式;所以称为非短路;
- 如果存在T1&&T2,当T1为false时,返回值已经确定为false,就不会运算T2表达式;所以称为短路;
- |与||也存在类似逻辑,T1||T2 ,当第一个表达式T1为true时,因为已经确定了返回值肯定是true ,所以||就不再运算第二个表达式T2;
public class LogicOperator {
public static void main(String[] args) {
int a = 4;
int b = 1;
//全真为真(左右两个表达式都为真) 有假为假(左右有一个为假,结果为假)
// & 无论左边表达式是否为假 ,右边都执行 执行到了第二个条件 b++
System.out.println(a > 5 & b++ < 3);
System.out.println("b=" + b); //b=2
//&&左边的表达式为false,就已经知道了逻辑表达式的结果了 ,右边的表达式就不会再执行
System.out.println(a > 5 && b++ < 3);
System.out.println("b=" + b); //b=2
//! 非 取反
System.out.println(!(a > 5 && b++ < 3)); //true b++ < 3 返回的是true b++表达式的值是2
// a>5 为false b<3为true 异或^ 最后结果为true
System.out.println(a > 5 ^ b < 3);
int c = 4;
int d = 1;
System.out.println(c > 3 | d++ < 3); //true
System.out.println("d=" + d); //d=2
System.out.println(c > 3 || d++ < 3); // true
System.out.println("d=" + d); //d=2
}
}
5、位运算符
位运算符针对操作数的二进制位进行运算;
15的二进制是00001111, 6的二进制是00000110
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
& | 位与(二进制位进行&运算,只有1&1时结果是1,否则是0;) | 15&6 | 6 |
位或(二进制位进行 | 运算,只有0 | ||
^ | 异或(相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1) | 15^6 | 9 |
~ | 按位非,将操作数的每个位(包括符号位)全部取反。 | ~6 | -7 |
<< | 左移位(空位补0,被移除的高位丢弃,空缺位补0。) | 8<<2 | 32 |
>> | 右移位( 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。) | 8>>2 | 2 |
>>> | 无符号右移位(被移位二进制最高位无论是0或者是1,空缺位都用0补。) | 8>>>2 | 2 |
public class BitOperator {
/*
&:按位与 两位同时为1,才返回值1
|:按位或 只要有1位为1就返回值1
^:按位异或 相同为0,不同时返回1
~:按位非,将操作数的每一位(包括符号位)全部取反
<<:左移位,8<<2 ====8*2的2次幂=== 左操作数*2的右操作数次幂
>>:右移位,8>>2 ===8除以2的2次幂==== 左操作数除以2的右操作数次幂
>>>: 无符号又右移
1248
15: 0000 1111
6: 0000 0110
15&6 0000 0110
15|6 0000 1111
15^6 0000 1001
~6 1111 1001
十进制 1 00000001 byte -128
-1 10000001
15&6 0000 0110 6
15|6 0000 1111 15
15^6 0000 1001 9
十进制8 二进制 1000
8<<2 100000 结果十进制 32 相当于8*2^2(2^2 表示2的2次幂)
8>>2 10 结果十进制 2 相当于8/2^2(2^2 表示2的2次幂)
7>>2 (111) 1 结果十进制 1 相当于7/2^2(2^2 表示2的2次幂)
~6 (00000110 取反 11111001 再减去1 11111000 除去符号位取反得到原码 10000111(原码) 十进制值 -7
1 */
public static void main(String[] args) {
System.out.println(15&6);
System.out.println(15|6);
System.out.println(15^6);
System.out.println(~6);
System.out.println(~-6);
System.out.println(8<<2); //左操作数*2的右操作数次幂 32
System.out.println(8>>2); //左操作数除以2的右操作数次幂 2
System.out.println(8>>>2); //2
// System.out.println(7>>2); //7除以4 1
}
}
比2*8运算效率更高的运算方式是什么?
2<<3
6、三元运算符
三元运算符格式:
表达式1?表达式2:表达式3
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
//三元运算符
public class TernaryOperator {
public static void main(String[] args) {
// test01();
test02();
}
//给一个成绩,如果成绩大于60就是及格,否则就是不及格
private static void test01() {
int score=68;
String mark = (score>=60) ? "及格" : "不及格";
System.out.println("考试成绩如何:"+mark);
}
//获取两个数中的较大数
//获取三个数中的较大数
private static void test02() {
int a = 10;
int b = 12;
int c = 13;
int max1 = a>b?a:b;
System.out.println("两个数中最大的值是:"+max1);
int max2 = (a>b?a:b)>c?(a>b?a:b):c;
System.out.println("三个数中最大的值是:"+max2);
}
}
7、复杂的表达式
表达式是由操作数和运算符按一定的语法形式组成的符号序列。
一个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值;
表达式的值还可以用作其他运算的操作数,形成更复杂的表达式。
num1+num2
a*(b+c)+d
3.14
x<=(y+z)
x&&y||z
/* 从控制台输入学员王浩3门课程成绩,编写程序实现
(1)Java课和SQL课的分数之差
(2)3门课的平均分*/
public static void test03() {
//1.获取Scanner对象
Scanner sc = new Scanner(System.in);
//2.获取控制台输入的三门成绩
System.out.println("java的成绩是:");
double javaScore = sc.nextDouble();
System.out.println("sql的成绩是:");
double sqlScore = sc.nextDouble();
System.out.println("html的成绩是:");
double htmlScore = sc.nextDouble();
//3.输出获取到的内容
System.out.println("\n\njava\t sql\t html");
System.out.println(javaScore+"\t"+sqlScore+"\t"+htmlScore+"\n\n");
//4.计算成绩差
double diff = javaScore-sqlScore;
//5.计算平均分
double avg = (javaScore+sqlScore+htmlScore)/3;
//6.输出
System.out.println("java和sql的成绩差:"+diff);
System.out.println("三门成绩的平均分:"+avg);
}