package com.briup.day02;
/**
* @author chouhan
* 3.常量优化机制、运算符
*/
public class Test1 {
public static void main(String[] args) {
// float f=3.14;
float f=3.14f;//必须加上f
System.out.println(f);
// boolean b=1;
boolean b=true;//boolean类型只有true和false
System.out.println(b);
//0x771默认是int类型,但0x771=0111 0111 0001有效值超过8位会出现数据的丢失,报错
// byte b1=0x771;
/**
* 1.隐式类型转换
* byte,short,char类型数据在进行算术运算时,会自动提升为int,
* 其他类型运算时,表示范围小的会自动提升为范围大的,然后再运算。
* byte,short,char-int-long-float-double
* 赋值过程中,小数据类型可以直接赋值给大类型,类型自动进行转换。
* 2.显式类型转换
* 赋值过程中,大类型数据赋值给小类型变量,会报错,必须通过强制类型转换实现。
* 为什么float大于long?因为计算机底层保存float类型时还有指数位。
* long类型最大值:2^63-1
* float类型非最大值:1*(1+0)*2^(254-127)=1*1*2^127=2^127
* float类型可以取到2^127 远大于long类型最大值 2^63-1
*/
byte b1=126;
// byte b2=b1+3;//b1在计算前先转换成int类型的126,+3得到129,补码运算得到的是-127
byte b2=(byte) (b1+3);
/**
* 为什么129会变成-127?
* 129:0000 0000 0000 0000 0000 0000 1000 0001先截取,得到1000 0001
* 再计算,是对1000 0001进行计算,对负数进行原反补:-127
*/
System.out.println("b2="+b2);
short s1=1;
s1=(short) (s1+1);
short s2=1;
s2+=1;
//常用的ASCII码值:a-97,A-65,0-48
//字符类型数据在进行运算或赋值时,会根据ASCII码表进行运算
//字符串参与运算的+号表示拼接,字符串+其他任意类型得到的结果都是字符串
//取余:4%-3和-4%3:只看左操作数的正负
System.out.println(4%(-3));//1
System.out.println((-4)%3);//-1
//++,--:++a先赋值,a++先运算。
//++、--和+=、-=中,系统默认会进行隐式类型转换
int x=4;
int y=(x++)+(++x)+(x*10);
/**
* 赋值操作也是运算。
* a++先运算是指把4放入内存空间,参与完运算,内存空间才变成5;
* ++a先赋值是指先自增5变成6,再放入内存空间,再运算;
* 4+6+6*10=70
*/
System.out.println(y);//70
int i=1;
System.out.println(i++ + i--);//1+1 +2 -1=3
/**
* 位运算符:& | ~ ^
* 逻辑运算符:& | ! ^ && ||
*/
//^:异或:相同为0,不同为1
/**交换俩个变量的值,但不能使用中间变量**/
//使用中间变量的情况
int p1 = 1;
int q1 = 2;
int temp = p1; //p1:1 q1:2 temp:1
p1 = q1;//p1:2 q1:2 temp:1
q1 = temp;//p1:2 q1:1
//不是使用中间变量,使用+,-操作
int p2 = 1;
int q2 = 2;
q2 = p2+q2;//p2:3 q2:2
q2 = p2-q2;//p2:3 q2:1
p2 = p2-q2;//p2:2 q2:1
//不是使用中间变量,使用^操作
int p3 = 1;
int q3 = 2;
p3 = p3^q3;
q3 = p3^q3;
p3 = p3^q3;
/**
* 如果把这三种方法封装起来调用,把两个数作为方法的形参;
* 那么操作的是两个形参,最后输出的只会是实参的值,交换没有意义。
*/
//左移,右移,无符号右移
/**
* 1.>>:算术右移位运算,本质就是除以2的n次方,这个n是右移的位数。只保留整数部分。
* 正数右移之后,最左边空出的位置,都要补0;负数右移之后,最左边空出的位置,都要补1。
* 2.<<:左移位运算,本质就是乘以2的n次方,n是左移的位数。
* 无论正数负数左移之后,最右边空出的位置,都要补0。
* 比如:对int类型进行移动33位,实际上只移动了33%32=1位。如果对int型移动32位,实际上只移动了32%32=0位。
* 3.>>>:逻辑右移位运算,也叫无符号右移运算,本质就是除以2的n次方,n就是右移的位数。
* 只保留整数部分正数和负数右移之后,最左边空出的位置,都要补0。
*/
/**
* 控制语句if,分支语句switch-case,
* 1.switch适用于比较固定值,if控制语句可以替代所有的switch-case,if适用于判断区间
*
* 循环语句for,while,do-while,
* 2.for循环和while循环的区别:
* 1)如果想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。
* 2)不知道用谁就用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
*
* 跳出循环的语句break,continue,return
* 3.(1)break用在循环体内部,作用是结束整个循环;
* (2)continue用于循环体内部,作用是结束本次循环,进入到下一次循环;
* (3)return是用于结束方法的语句。
*/
}
}
Java常量优化机制
最新推荐文章于 2023-08-07 17:01:36 发布