Java语言基础(三)

运算符

  • 3.1 算术运算符
  • 3.2 算术运算符的注意事项
  • 3.3 算术运算符的案例(实现时间拆分)
  • 3.4 字符串连接符
  • 3.5 关系运算符/比较运算符
  • 3.6 自增减运算符(笔试)
  • 前后加加的区别
  • 笔试考点
  • 3.7 逻辑运算符
  • 3.8 逻辑运算符的短路特性(笔试)
  • 3.9 条件运算符/三目运算符
  • 3.10 赋值运算符(笔试)
  • 考点
  • 3.11 移位运算符(了解)
  • 3.12 位运算符(了解)
  • 3.12 运算符的优先级
  • 总结


运算符

3.1 算术运算符

• +
• -
• *
• / (正斜杠,撇正捺反)
• % --> 取余

3.2 算术运算符的注意事项

  • (1)当两个整数相除时,结果只保留整数部分,丢弃小数部分
System.out.println(5 / 2); // 2
  • (2)若希望保留小数部分该如何处理?
  • 处理方式一:
System.out.println((double)5 / 2);   // 2.5
System.out.println(5 / (double)2);   // 2.5
System.out.println((double)5 / (double)2); // 2.5
System.out.println((double)(5 / 2)); // 2.0
  • 处理方式二(推荐): 让其中一个操作数乘以1.0即可
System.out.println(5*1.0 / 2); // 2.5
System.out.println(5.0 / 2);   // 2.5   ia.0 错误的表示
  • (3)0不能作除数
//System.out.println(5 / 0); // 编译ok,运行发生java.lang.ArithmeticException(算术异常 记住): / by zero
System.out.println(5 / 0.0); // Infinity 无穷
System.out.println(0 / 0.0); // NaN Not a Number

3.3 算术运算符的案例(实现时间拆分)

  • 提示用户输入正整数类型的秒数,拆分秒数后输出x小时x分x秒
  • 如:输入7199,输出1小时59分59秒
/*
    编程使用算术运算符实现秒数的拆分
 */

import java.util.Scanner; 
 
public class ArithmeticTimeTest {
	
	public static void main(String[] args) {
		
		// 1.提示用户输入一个正整数的秒数并使用变量记录
		System.out.println("请输入一个正整数的秒数:");
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		
		// 2.将正整数的秒数拆分为时分秒后并使用变量记录
		// 3666秒 => 1小时1分钟6秒钟
		// 3666 / 3600 = 1 小时     3666 % 3600 = 66 / 60 = 1 分钟     3666 % 60 = 6 秒钟 
		int hour = num / 3600;      // 拆分小时数
		int min = num % 3600 / 60;  // 拆分分钟数
		int sec = num % 60;         // 拆分秒数
		
		// 3.打印最终的拆分结果
		System.out.println(num + "秒转换为" + hour + "小时" + min + "分钟" + sec + "秒钟");
	}
}

3.4 字符串连接符

+ 可以实现字符串的连接。同时可以实现字符串与其他数据类型“相连”

public class ArithmeticTimeTest {
	
	public static void main(String[] args) {
		
		int hour = 1;  
		int min = 1;  
		int sec = 6;    
		
		// +既可以作为字符串连接符,又可以作为加法运算符
		// 只要+两边的操作数中有一个操作数是字符串类型,则该+就被当做
		// 字符串连接符处理,否则当做加法运算符处理
		System.out.println(hour + min + sec);       // 8
		System.out.println(hour + min + sec + "");  // 8
		System.out.println(hour + min + "" + sec);  // 26 ,先算1+1=2,然后遇到字符串后,2才被当做字符串处理
		System.out.println(hour + "" + min + sec);  // 116
		System.out.println("" + hour + min + sec);  // 116
		System.out.println("" + (hour + min + sec));// 8
	}
}

3.5 关系运算符/比较运算符

  • 一共六个,输出结果是布尔值,true 和 false
 >
• >=
• <
• <=
• ==
• !=

3.6 自增减运算符(笔试)

  • ++ 表示自增运算符,用于使得当前变量自身的数值加1的效果
  • - - 表示自减运算符,用于使得当前变量自身的数值减1的效果
  • 注:只能用于变量,常量不可以

前后加加的区别

  • 后++ 表示先让变量的数值作为整个表达式的结果,然后再让变量自身数值加1
  • 如 i++
  • 前++ 表示先让变量自身数值加1,然后再让变量数值作为整个表达式的结果
  • 如 ++i
  • 前后减减 同理

笔试考点

int ib = ia++;
System.out.println("ib = " + ib); // 12
System.out.println("ia = " + ia); // 13
int ic = ++ia;
System.out.println("ic = " + ic); // 14
System.out.println("ia = " + ia); // 14
		
//                  14  +  16
System.out.println(ia++ + ++ia);  // 30
System.out.println("ia = " + ia); // 16

3.7 逻辑运算符

  • && 表示逻辑运算符
  • || 表示逻辑运算符
  • ! 表示逻辑运算符
  • 注:逻辑运算符的操作数均为boolean表达式

3.8 逻辑运算符的短路特性(笔试)

  • 对于逻辑,&&,如第一个表达式为假,则结果为假,此时跳过第二个表达式
  • 对于逻辑,||,若第一个表达式为真,则结果为真,此时跳过第二个表达式
// 测试一下短路特性
int ia = 3;
int ib = 5;

// 对于逻辑与运算符来说,若第一个条件为假则整个表达式为假,此时跳过第二个表达式不执行
boolean b4 = (++ia == 3) && (++ib == 5);
System.out.println("b4 = " + b4); // false
System.out.println("ia = " + ia); // 4
System.out.println("ib = " + ib); // 5

// 对于逻辑或运算符来说,若第一个条件为真则整个表达式为真,此时跳过第二个表达式不执行
boolean b5 = (++ia == 5) || (++ib == 5);
System.out.println("b5 = " + b5); // true
System.out.println("ia = " + ia); // 5
System.out.println("ib = " + ib); // 5

3.9 条件运算符/三目运算符

  • 语法格式:
  • 条件表达式 ? 表达式1 : 表达式2
  • 先判断条件表达式是否成立,若成立则则执行表达式1,否则指定表达式2
// 1.使用三目运算符来判断是否为三位数
System.out.println(num + ( (100 <= num && num <= 999)? "是三位数": "不是三位数") );
// 2.使用三目运算符找到最大值并打印(ia、ib已知)
int max = ia > ib? ia: ib;
System.out.println("最大值是:" + max);
System.out.println("最大值是:" + (ia > ib? ia: ib));

3.10 赋值运算符(笔试)

  • = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量,覆盖变量原来的数值
  • 赋值表达式本身也有值,其本身之值即为所赋之值
  • +=、-=、*=、/=、…
// 将6赋值给ia,然后ia=6是个赋值表达式,其本身之值为6,接下来将该赋值表达式的值赋给ib,因此ib=6
int ib = ia = 6;

考点

  • (1)考点一:
  • a = a + 1 和 a += 1 从结果上是等价的,但还是有区别
  • a += 1 等价于 a = (byte)(a + 1)
  • byte + int 相加结果还是int类型
  • byte + byte 相加结果还是int类型(编译器优化)
byte a1 = 10;
//a1 = a1 + 2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失 (byte + int 相加结果还是int类型)
//a1 = a1 + (byte)2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失(编译器优化,byte + byte 相加结果还是int类型)
  • (2)考点二:(写代码时经常犯的错误)
  • 推荐写 2 == ia,因为少写一个=,表达式变成2 = ia,编译器报错,会让我们较少错误
  • 调试的时候赋值的错误很难发现,比如不小心把 a == 2 写成 a = 2,调试的时候很难发现的
ia == 2; //表示判断变量ia的数值是否等于2
2 == ia; //表示判断2是否等于变量ia的数值,从结果上来说等价,推荐该方式
ia = 2;  //表示将2赋值给变量ia,覆盖变量ia原来的数值
2 = ia;  //编译报错  错误: 意外的类型

3.11 移位运算符(了解)

  • 开发中不常用(但是看java源码时可能会遇到)
  • << 左移运算符,用于将数据的二进制位向左移动,右边使用 0 补充
  • >> 右移运算符,用于将数据的二进制位向右移动,左边使用符号位补充
  • >>> 逻辑右移运算符(无符号右移运算符),用于将数据的二进制位向右移动,左边使用0补充
byte b1 = 13;
// 左移运算符
// 13的二进制是:... 0000 1101  => 左移1位的结果是:... 0001 1010 => 换算为十进制整数是:26
//byte b2 = b1 << 1; //错误: 不兼容的类型: 从int转换到byte可能会有损失   自动提升为int类型,也就是32位二进制(4个字节)
byte b2 = (byte)(b1 << 1);  // b2 = 26
System.out.println(b1 << 1); // 26    左移1位相当于当前整数的数值*2(2^1)
System.out.println(b1 << 2); // 52    左移2位相当于当前整数的数值*4(2^2)

// 右移运算符
// 13的二进制是:... 0000 1101 => 右移1位的结果是:... 0000 0110 => 换算为十进制整数是:6
System.out.println(b1 >> 1); // 6     右移1位相当于当前整数的数值/2(注意/只保留整数部分)
System.out.println(b1 >> 2); // 3     右移2位相当于当前整数的数值/4

// 逻辑右移   对于非负数来说,逻辑右移和右移的效果一致
System.out.println(b1 >>> 2); // 3

3.12 位运算符(了解)

  • & 表示按位运算符,按照二进制位进行与运算(和逻辑与运算符同理)
  • | 表示按位运算符,按照二进制位进行或运算(与逻辑或运算符同理)
  • ~ 表示按位取反运算符,按照二进制位进行取反,1为0,0为1
  • ^ 表示按位异或运算符,按照二进制位进行异或运算,同为0,不同为1
  • (异或 记忆方法:领结婚证,同性不能结婚,为0,异性能结婚,为1)
byte b1 = 11;
byte b2 = 13;
System.out.println( b1 & b2);  // 按位与:同1为1,一0为0      按位与后的二进制为:0000 1001  => 转为十进制是:9
System.out.println( b1 | b2);  // 按位或:一1为1,同0为0      按位或后的二进制为:0000 1111  => 转为十进制是:15
System.out.println( b1 ^ b2);  // 按位异或:相同为0,不同为1   按位异或的二进制为:0000 0110  => 转为十进制是:6
System.out.println( ~ b1);     // 按位取反:1为0,0为1         按位取反的二进制为:1111 0100  => 转为十进制是:-12

3.12 运算符的优先级

  • 优先级从上到下也越来越低
  • 结合性表示某个运算符先操作左边还是先操作右边
  • 记忆方法:
  • (1)小括号()优先级极高
  • (2)等号 = 优先级极低
  • (3)若无法确认优先级, 则使用()来确保即可

总结

java以秒计时_java