运算符&流程控制语句
变量案例补充
// 编译这一行时,由于'b'没有超出c的范围,所以编译成功
char c = 'b';
// 编译这一行时,系统只知道c是char类型,而不知道c具体的值。
// c是char类型,范围是0-65535
// s是short类型,范围是-32768 - 32767
// 由于c的正整数范围比s的正整数范围大,所以系统认为有可能放不下,报错。
short s = (short) c;
System.out.println(c);
System.out.println(s);
1 运算符
1.1 运算符介绍
-
运算符概述
- 对常量或者变量进行操作的符号称之为运算符 +
-
表达式概述
- 用运算符把常量或者变量连接起来,符合java语法的式子叫做表达式。
- a + b
-
运算符分类
- 算术运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 三元运算符
- 位运算
1.2 算术运算符
1.2.1 常规算术
+ - * / %
public static void main(String[] args) {
// 重命名 shift + f6
// 加 +
// 减 -
// 乘 *
// 除 /
// 取余 % 不看商,只看余数
int a = 10;
int b = 20;
System.out.println(a + b);// 30
System.out.println(a - b);// -10
System.out.println(a * b);// 200
// 在java中,对于整数来说,除法用的是小学一年级的算法
// / 只看商,舍弃余数
System.out.println(a / b);// 0
// 只要算数运算中出现了小数,那么结果肯定是小数
System.out.println(1 / 2.0);
int i = (int) (4350.0 / 1000 * 1000);
System.out.println(i);
System.out.println(1 % 2);
int num = 34324334;
System.out.println(num % 2);
}
1.2.2 扩展
// 负数取余 就是看表达式左边值的符号 如果左边是正数,那么结果就是正数。如果左边是负数,结果就是负数
System.out.println(-5 % 3);
// 小数取余
System.out.println(3.6 % 2);//1.6
System.out.println(3 % 1.4);//0.2
System.out.println(3 - 2.09);
// ArithmeticException:数学异常
// System.out.println(1 / 0);
// NaN not a number 不是一个数字
System.out.println(0.0 / 0);
// +可以用于字符相加
char zifu1 = '我';
System.out.println(zifu1 + 1);
// + 可以用于字符串连接 任何数据类型和字符串进行相加,结果肯定是一个字符串
System.out.println("Hello" + 1);
// "Hello" + 3
System.out.println("Hello" + (1 + 2));
System.out.println("最大值是" + a);
1.2.3 自增自减运算符
自增运算符 ++
自减运算符 - -
格式:可以放在变量前面,也可以放在变量后面
区别:
- 对于单独使用,自增自减运算符放在变量前面和后面没有任何区别。
- 对于混合使用
- 如果++(–)符号在变量前面,那么会先将变量自身立刻加1(减1),然后根据加1(减1)之后的结果进行其他操作
- 如果++(–)符号在变量后面,那么会先进行其他操作,然后在进行加1(减1)
int a = 10;
a++;
System.out.println(a);
int b = 10;
++b;
System.out.println(b);
int num1 = 10;
// 以下代码干了2件事
// 1.输出变量结果
// 2.给num1加1
// 1. 如果++(--)符号在变量前面,那么会先将变量自身立刻加1(减1),然后根据加1(减1)之后的结果进行其他操作
// 2. 如果++(--)符号在变量后面,那么会先进行其他操作,然后在进行加1(减1)
System.out.println(num1++);// 10
System.out.println(num1);// 11
int num2 = 10;
System.out.println(++num2);//11
System.out.println(num2);//11
int num3 = 10;
int result = num3++ + 1;
System.out.println(result);// 11
System.out.println(num3);// 11
int x = 30;
int y = 40;
// 30 + 39
int z = x++ + --y;
System.out.println(x);// 31
System.out.println(y);// 39
System.out.println(z);// 69
// 以下代码在运算完成之后,Java在底层会对结果做一个强制类型转换
byte b1 = 3;
b1++;
System.out.println(b1);
拓展:
public static void main(String[] args) {
int a = 10;
int b;
//理解为 a 被赋值时开辟了新的内存,之后老的 a 再自加 1 但与新的 a 已经无关
a = a++;
System.out.println(a);// 10
b = a++;
System.out.println(a);// 11
}
1.3 赋值运算符
1.3 赋值运算符
赋值运算符代表一个动作,将右边的值交给符号左边的内容
分类:
- =
- +=
- -=
- *=
- /=
- %=
// = 赋值运算符
int num1 = 10;
int num2 = num1;
System.out.println(num1);
System.out.println(num2);
// 复合运算符
// +=
int a = 10;
a += 20; // 相当于 a = a + 20;
System.out.println("a的值是" +a);
// -=
a -= 5;// 相当于 a = a - 5;
System.out.println("a的值是" + a);
// *=
a *= 10;// 相当于 a = a * 10;
System.out.println("a的值是" + a);
// /=
a /= 5;// 相当于 a = a / 5;
System.out.println("a的值是" + a);
int b = 4;
// d = 4 += 4 -= 4 *= 4;
// d = 4 += 4 -= 16;
// d = 8 -= 16
// d = -8
int d = b += b -= b *= b;
System.out.println(d);// -8
// 复合运算符默认底层有一个强制类型转换
byte b1 = 10;
// b1 = (byte) (b1 + 10);
b1 += 10;// b1 = b1 + 10;
1.4 关系(比较)运算符
- ==(相等) !=(不相等) > (大于) < (小于) >= (大于等于) <= (小于等于)
- 关系运算符的结果都是boolean类型,要么是true,要么是false
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);
}
- 注意:关系运算符中的 == 不要误写成 =
1.5 逻辑运算符
- 作用:逻辑运算符用于连接布尔类型的表达式。
- 在java中不能写 3 < x < 6
- 分类
- 与: & 有false则false
- 或: | 有true则true
- 异或: ^ 相同则false,不同则true
- 非: ! 取反 true则false,false则true
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
// 与 & 有false则false 并且
// true & true
System.out.println(a < b & a < c & b > c);
// 或 | 有true则true 或者
// true | false
System.out.println(a < c | a > b | a > c);
// 异或 ^ 相同就是false,不同就是true
// false ^ true
System.out.println(a > b ^ a > c ^ b > c);
// 非 ! 取反 true则false,false则true
System.out.println(!(a > b));
}
- & | ^ 可以连接多个表达式 !只能连接一个表达式
补充:
1. & 和| 哪个优先级更高?
&的优先级高于 |
// & 比 | 优先级高
// true
System.out.println(false & true | true);
// true
System.out.println(true | true & false);
2. && 和 &的区别(面试题)?
&&和&在结果上是完全一样的。只是&&的效率更高.
&&有短路效果:如果左边的表达式已经可以判断出最终的结果,那么右边的代码就不会执行.
// 如果左边的表达式已经可以判断出最终的结果,那么右边的代码就不会执行.
// false & true
System.out.println(a > b && a < c);
int num = 100;
System.out.println(3 > 4 && ++num < 1000);
System.out.println(num); // 100 因为 && 左边的结果是false,右边的代码就不需要执行了 ++num根本没有执行
注意: || 和| 也是一样的效果,||也有短路效果
1.6 三元(三目)运算符
三元运算就是有三个元素参与的运算。
格式: 数据类型 变量名 = 判断条件 ? 表达式A : 表达式B;
判断条件必须是一个布尔值
如果条件结果是true,那么将表达式A赋值给变量。
如果条件结果是false,那么将表达式B赋值给变量。
// 获取两个变量的最大值
int a = 30;
int b = 20;
int max = a > b ? a : b;
System.out.println("最大值是" + max);
1.7 练习
输入3个整数,获取这3个整数的最大值.
public static void main(String[] args) {
// 练习:在控制台输入3个整数,获取3个整数的最大值
Scanner scanner = new Scanner(System.in);
System.out.println("请您输入三个整数:");
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
// 先获取 a b 的最大值
int max1 = a > b ? a : b;
// 用c和ab的最大值进行比较
int max = max1 > c ? max1 : c;
System.out.println("最大值是" + max);
}
2 键盘录入
获取用户通过键盘输入的整数。
格式
Scanner 变量名 = new Scanner(System.in);
int a = 变量名.nextInt();
3 package
package是java语言中的包机制,包本质上就是一个文件夹。package用来声明当前文件所在的包。
目的是为了方便程序的管理。
包名全部使用小写,中间用.隔开。一般包名都是公司域名的反写。
package声明包的代码必须在java文件的有效代码的第一行。
import是java中的关键字,用来导入其他地方的包的文件。
4 流程控制语句
4.1 概述
在一个程序执行的过程中,各条语句的执行顺序对于程序的结果是有直接影响的。也就是说程序执行的流程对于结果有影响。
所以我们必须清楚每条语句的执行流程,而且我们可以通过流程控制语句来控制程序的执行顺序。
- 分类
- 顺序结构
- 选择结构
- 循环结构
4.2 顺序结构
是程序中最基本最简单的流程控制,没有特点的语法结构,按照代码编写的先后顺序,依次执行。程序中大部分代码都是这样执行的。
public static void main(String[] args) {
System.out.println("一天晚上");
System.out.println("两个和尚");
System.out.println("三更半夜");
System.out.println("四处流浪");
System.out.println("误入洞房");
}
4.3 选择结构
4.3.1 概述
-
选择结构也称之为分支结构。
-
选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,可以根据结果执行不同的代码。
-
Java语言中提供了两种选择结构的语句
- if语句
- switch语句
4.3.2 if语句
if语句分为三种格式
- 格式一
if (关系表达式){
语句体;
}
执行流程:
首先判断关系表达式的结果是true还是false
如果是true就执行语句体中的代码
如果是false就不执行语句体中的代码
注意点:如果{}中只有一条代码,{}可以省略
public static void main(String[] args) {
// 格式一
System.out.println("晚上闲的没事在大街游荡");
System.out.println("发现一个成人娱乐场所");
int age = 19;
if (age >= 18) //判断是否成年
System.out.println("刷身份证");
System.out.println("回家睡觉...");
}
- 格式二
if (关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
public static void main(String[] args) {
// true:男 false:女
boolean sex = false;
if (sex){
System.out.println("去男老八快乐屋");
}else {
System.out.println("去女老八快乐屋");
}
}
- 格式三
if (关系表达式1){
执行语句1;
}else if (关系表达式2){
执行语句2;
}else if (关系表达式3){
执行语句3;
}
...
else{
执行语句n;
}
执行流程:
首先判断关系表达式1,看其结果是true还是false。
如果是true,就执行语句1;然后if语句结束
如果是false,继续判断关系表达式2是true还是false。
如果是true,就执行语句2;然后if语句结束
如果是false,就继续判断关系表达式3是true还是false。
如果是true,就执行语句3;然后if语句结束
如果是false,继续判断
…
如果没有任何关系表达式为true,就执行else中的语句n
public static void main(String[] args) {
// 结构三
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int age = scanner.nextInt();
if (age >= 3 && age <= 7){
System.out.println("爸爸妈妈去上班,我去幼儿园");
}else if (age > 7 && age < 13){
System.out.println("上小学,带红领巾");
}else if (age >= 13 && age < 16){
System.out.println("上初中,开始早恋");
}else if (age >= 16 && age < 19){
System.out.println("上高中,开始苦读");
}else if (age >= 19 && age < 25){
System.out.println("上大学,公开谈恋爱");
}else {
System.out.println("开始挣钱...");
}
}
4.4 练习
- 用户输入一个整数,判断是奇数还是偶数
public static void main(String[] args) {
// 用户输入一个整数,判断是奇数还是偶数
/**
* 获取用户输入的整数 Scanner
* 偶数:如果对2取余,结果是0,就是偶数,否则就是奇数
*/
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i % 2 == 0){
System.out.println("您输入的是一个偶数");
}else {
System.out.println("您输入的是一个奇数");
}
}
- x和y的关系满足如下:
x >= 3 y= 2x +1
-1<x<3 y=2x;
x<=-1 y=2x - 1;
根据给定的x的值,计算出y的值并输出到控制台。
public static void main(String[] args) {
// x >= 3 y= 2x +1
// -1<x<3 y=2x;
// x<=-1 y=2x - 1;
// 创建Scanner
Scanner scanner = new Scanner(System.in);
System.out.println("请输入x的值");
int x = scanner.nextInt();
int y;
if (x >= 3){
y = 2 * x + 1;
}else if(x > -1 && x < 3){
y = 2 * x;
}else{
y = 2 * x - 1;
}
System.out.println("y = " + y);
}