day03
运算符和表达式
运算符: 对字面量或者变量进行操作的符号
表达式: 用运算符把字面量或者变量连接起来,
符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同
类型的表达式。
常见运算符
小细节
-
只有整数参与计算,结果只能得到整数,有小数部分则去掉小数!!!
-
小数参与计算,结果有可能是不精确的,如果我们需要精确计算,那么需要用到后面的知识点。
小练习
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int i = sc.nextInt();
System.out.println("输入的值"+i);
int a=i/100%10;//获得百位
int b=i/10%10;//获得十位
int c=i/1%10;//获得个位
System.out.println("百位"+a+"十位"+b+"个位"+c);
}}
控制台输出:
123
输入的值123
百位1十位2个位3
进程已结束,退出代码为 0
隐式转换与强制转换
隐式转换(类型小变大)
隐式转换的两种提升规则
- 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
- byte,short,char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算
强制转换(类型大转小)
需要我们显式书写,书写格式如下
(数据类型)(a+b+c+d...)
字符串的拼接
在有字符或字符串的式子中
代码从左到右依次执行" + "两边只要有字符或者字符串就会执行字符串拼接,而非计算
字符的计算
当字符参与计算时直接提升为int类型,且对应的值为ascii码表中的值
A:65
a:97
自增自减运输符
i++和++i
- i++ 先用后加
int a=10;
int b=a++;//执行完后b中的值为10,a++先赋值给b,再对自身执行+1操作
//执行完上一行的代码后,此时a的值为11
- ++i先加后用
int a=10;
int b=++a;//执行完后b中的值为11,++a先对自身操作执行+1操作,再赋值给b
//执行完上一行的代码后,此时a的值为11
赋值运算符
小细节
在赋值运算符中隐藏了一个强制类型转换
a数据类型 s+= 1;
//等价于
a数据类型 s=(a数据类型)(s+1);
关系运算符
逻辑运算符
^(逻辑亦或)的民政局记忆方法
男男:false
女女:false
男女:true
短路运算符(逻辑运算符plus)
小细节
当左边的表达式能确定最终的结果,那么右边就不会参与运行了
int b=10;
int a=10;
boolean result=++a<5&&++b<5;//++b并没有成功对自己自加1,因为&&前面的语句已经成功判断了
System.out.println(result);
System.out.println(a);
System.out.println(b);
控制台如下:
false
11
10
进程已结束,退出代码为 0
小练习
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println("第一个数"+a);
Scanner scanner1 = new Scanner(System.in);
int i = scanner1.nextInt();
System.out.println("第二个数"+i);
System.out.println((a+i)%6==0);
System.out.println(a==6||i==6);
}}
控制台输出如下:
2
第一个数2
4
第二个数4
true
false
进程已结束,退出代码为 0
三元运算符
格式:关系表达式?表达式1:表达式2;
//关系结果为真运行表达式1,为假则执行表达式2
且三元运算符一定要被使用,直接写一行会报错
小练习
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println("第一个数"+a);
Scanner scanner1 = new Scanner(System.in);
int i = scanner1.nextInt();
System.out.println("第二个数"+i);
System.out.println(a==i?"体重相同":"体重不同");
}}
[!NOTE]
ctl
+alt
+L
自动格式化代码
运算符号
运算符号具有优先级
但用小括号一定是优先于所有
原码反码和补码
原码
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
源码的范围为**-127**~+127
弊端
负数计算不符实际,运算相反
负数的计算
当符号位为负数时,加减法是在数据的位置上相加的
例如(-2)+1
在计算机中是这样加的-(符号位) 2+1(数据)
,即负号不变,在数据的位置上进行2+1 的操作,再把负号和3拼接在一起得到结果**-3**
反码
解决负数计算不符实际
计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。
当在反码的基础上进行加减法操作时,实际上是对加减的数进行取负操作
例如(-2)+1
,可视作在原码进行如下操作-(符号位) 2+(-1)(数据)
对1取负得到正确值**-3**
补码
解决**+ -0的问题**
对**+ -0**的补码统一规范为0000 0000
此时补码的范围为+127~-128
由于**- 0的补码变成了0000 0000,故会多出来一位补码1000 0000,规定为-128,且没有反码与补码**
注意点
计算机的储存和计算都是以补码的形式进行的
基本数据类型转换的解释
隐式转换
转化为大的字节时直接前面补充0
强制转换
截取前面多余的比特数
输出 44
输出 -56
其他运算符
此运算符都是对数字进行操作
System.out.println(200&10);//输出为8
<< ,>> 和 >>>
< < 2: 向左移动两位,低位补0,
公式:左移一次*2
> > 2 :向右移动两位,高位补0或1(根据符号位来)
公式:右移一次/2
>>> 2 :向右移动两位,高位直接补0