运算符与表达式
一、运算符的分类
1.算数运算符
2.赋值运算符
3.比较运算符
4.逻辑运算符
5.位运算符
6.三元运算符
运算符既可以对变量进行运算,也可以对常量进行运算,被运算的数据称作操作数
二、熟练掌握算数运算符
算术运算符用来对操作数进行数学运算
运算符 |
运算规则 |
范例 |
结果 |
+ |
正号 |
+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是一个工具类,主要目标是简化文本的扫描,最常使用此类获取控制台输入
Scanner获取控制台输入的步骤
1、使用控制台输入创建Scanner对象
Scanner scanner=new Scanner(System.in);
2、调用Scanner中的nextXXX方法,获得需要的数据类型
例如:next、 nextLine、nextInt、nextByte等
(四)案例
1.. int a = 5 ; a = a++ + ++a + ++a +(a+1);请问a 的输出结果?29
public class a { public static void main(String[] args) { int a = 5 ; a = a++ + ++a + ++a +(a+1); //a=5+7+8+9 System.out.println(a); } }
2.从控制台输入学员王浩3门课程成绩,编写程序实现
(1)Java课和SQL课的分数之差
(2)3门课的平均分
思路:
- 导包java.util.Scanner
- Scanner scanner=new Scanner(System.in);
- 提示输入成绩
- 使用变量接收scanner.nextDouble();
- 输出三门课程的成绩
- 输出java和sql的成绩差
- 输出三门成绩的平均分
import java.util.Scanner; //导包 public class MyScanner { public static void main(String[] args) { //创建Scanner对象,System.in:键盘输入对象 Scanner scanner = new Scanner(System.in); //提示 System.out.println("请输入姓名:"); //接收键盘输入的姓名 String name = scanner.next();//next()返回的是字符串 //提示 System.out.println("请输入年龄:"); //接收键盘输入的年龄 int age = scanner.nextInt();//nextInt()返回的是整数 //输出 System.out.println("姓名:"+name); System.out.println("年龄:"+age); } } 结果: 请输入姓名: 张三 请输入年龄: 21 姓名:张三 年龄:21
三、熟练掌握赋值运算符
Java中的赋值可以使用普通的=进行赋值;也可以=与其他运算符一起进行复合赋值,即运算后赋值
运算符 |
运算规则 |
范例 |
结果 |
= |
赋值 |
int a=5; |
5 |
+= |
加后赋值 |
int a=5;a+=5; |
10 |
-= |
减后赋值 |
int a=5;a-=5; |
0 |
*= |
乘后赋值 |
int a=5;a*=5; |
25 |
/= |
整除后赋值 |
int a=5;a/=5; |
1 |
%= |
取模后赋值 |
int a=5;a%=5; |
0 |
int a = 3; a+=5;等同运算a=a+5;
short s = 3;
s=s+2;//报错
s+=2; //不报错
有什么区别?
s=s+2 先将右侧的操作数变量提升类型到int,赋值给s需要手动强制转换,不转换就报错
s+=2 编译器对+=进行特殊处理,包括强制转换,不报错
四、熟练掌握比较运算符
比较运算符又叫关系运算符,用来运算两个操作数的大小关系,返回值是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.除了== !=外,都只能比较基本数据类型
五、熟练掌握逻辑运算符
运算符 |
运算规则 |
范例 |
结果 |
& |
与 |
false&true |
false |
| |
或 |
false|true |
true |
^ |
异或 |
false^true true^true |
true false |
! |
非 |
!true |
flase |
&& |
双与(短路) |
false&&true |
false |
|| |
双或(短路) |
false||true |
true |
注意:&和 && 的不同
| 和 || 的不同
逻辑运算中的与和或运算都分别有两个,&和&&以及|和||
&和|称为非短路逻辑运算;|和||称为短路逻辑运算;
如果存在T1&T2,当T1为false时,返回值已经确定为false,但是依然还会运算T2表达式;所以称为非短路;
如果存在T1&&T2,当T1为false时,返回值已经确定为false,就不会运算T2表达式;所以称为短路;
|与||也存在类似逻辑,当第一个表达式为true时,因为已经确定了返回值肯定是true ,所以||就不再运算第二个表达式;
案例1:a>5 & b++<3表达式与a>5 && b++<3表达式有什么区别?
&:非短路 false 3 &&:短路 false 2
int a=1; int b=2; boolean result=a>5 && b++<3 ; System.out.println("result = " + result);//false System.out.println("b = " + b);//2
案例2: 模拟登入操作(控制台输入用户名和密码,非空判断)
import java.util.Scanner;】
public class 案例用户名判断 { public static void main(String[] args) { //成绩Scanner对象 Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入用户名:"); String username = scanner.nextLine(); System.out.println("请输入密码:"); String password = scanner.nextLine(); //判断 // if (username.equals("") || password.equals("")){ if (username.isEmpty() || password.isEmpty()){ System.out.println("用户名或者密码不能为空"); }else{ System.out.println("登录成功"); break; } } } }
六、深熟练掌握位运算包括位移运算和位逻辑运算的运算法则
位运算符针对操作数的二进制位进行运算;
15的二进制是00001111, 6的二进制是00000110
运算符 |
运算规则 |
范例 |
结果 |
& |
位与(二进制位进行&运算,只有1&1时结果是1,否则是0;) |
15&6 |
6 |
| |
位或(二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;) |
15|6 |
15 |
^ |
异或(相同二进制位进行 ^ 运算,结果是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 |
比2*8运算效率更高的运算方式是什么?
2<<3
负数在计算机中是用补码的形式存储的,正数在计算机中是用原码的形式存储的。
正数求原码直接将十进制转二进制即可,负数的补码是在原码的基础上除符号位外其余位取反后+1。
七、熟练掌握三元运算符
三元运算符格式:
表达式1?表达式2:表达式3
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
案例:获取两个数中的最大数 int a=100; int b=10; int max=a>b?a:b; System.out.println("max = " + max);
案例二:获取三个数中的最大数
案例二:获取三个数中的最大数 int a=100; int b=20; int c=300; int max=a>b?a:b; max=c>max?c:max; System.out.println("max = " + max);
八、复杂的表达式
表达式是由操作数和运算符按一定的语法形式组成的符号序列。
一个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值;
表达式的值还可以用作其他运算的操作数,形成更复杂的表达式。
num1+num2
a*(b+c)+d
3.14
x<=(y+z)
x&&y||z
九、作业
1、编写一段Java程序,每次用户从键盘输入一个整数,并且在控制台输出这个整数。如果输入的不是整数,控制台输出“输入错误”
public class 作业1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数:"); if (scanner.hasNextInt()){ System.out.println(scanner.nextInt()); }else{ System.out.println("输入错误"); } } }
2、给定一个任意的大写字母A~Z,转换为小写字母
(10分)
public class 作业2 { public static void main(String[] args) { /*String a="A"; String s = a.toLowerCase(); System.out.println("s = " + s);*/ char a='A'; char b=(char)(a+32); System.out.println("b = " + b); } }
3、取一个整数 a 从右端开始的 4~7 位。
123456789
import java.util.Scanner; public class 作业3 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数"); long l = scanner.nextLong(); String s = Long.toString(l); char[] chars = s.toCharArray(); int length = chars.length; if (length >=7){ System.out.println("从右端开始的 4~7 位:"+chars[length-7]+chars[length-6]+chars[length-5]+chars[length-4]); }else{ System.out.println("输入有误"); } } }