public static void main(String[] args) {
//算数运算符
int a=10;
int b=10;
int c=10;
a=b++;//a=10,b=11,c=10
c=--a;//a=9,b=11,c=9
b=++a;//a=10,b=10,c=9
a=c--;//a=9,b=10,c=8
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
int x = 4;
int y = (x++)+(++x)+(x*10);
//4 6 60
System.out.println("x:"+x);
System.out.println("y:"+y);
System.out.println('a');
System.out.println('a'+1);
System.out.println("hello"+'a'+1);
System.out.println('a'+1+"hello");
//例题
/*short s = 1;
s=s+1;
System.out.println(s);*/
//short类型参与运算时默认转化为int类型
//转而又赋值给short类型,则会损失精度
short s = 1;
s+=1;//扩展的赋值运算符其实隐含了一个强制类型转换
System.out.println(s);
//比较运算符,其返回值类型为布尔类型
int w=10;
int r=2;
boolean flag=(r==w);
System.out.println(flag);
System.out.println(r<=w);
//逻辑运算符 ,逻辑运算符一般用于连接boolean类型的表达式或值
//表达式:就是 用运算符把常量或者变量 连接起来的符合java语法的式子
//&:有false则false
//|:有ture则ture
//^:相同为false,不同为ture
//举例:情侣关系:男男,女女,男女,女男
//!:非false则ture,非ture则false;特点:偶数个不改变本身
int l=3;
int m=4;
int n=5;
//逻辑与
System.out.println((l>m)&(l>n));//false & false=false
System.out.println((l>m)&(l<n));//false & true=false
System.out.println((l<m)&(l>n));//true & false=flase
System.out.println((l<m)&(l<n));//ture & ture=ture
//逻辑或
System.out.println((l>m)|(l>n));//false | false=false
System.out.println((l>m)|(l<n));//false | true=ture
System.out.println((l<m)|(l>n));//true | false=ture
System.out.println((l<m)|(l<n));//ture | ture=ture
//逻辑异或
System.out.println((l>m)^(l>n));//false ^ false=false
System.out.println((l>m)^(l<n));//false ^ true=ture
System.out.println((l<m)^(l>n));//true ^ false=ture
System.out.println((l<m)^(l<n));//ture ^ ture=false
//逻辑非
System.out.println(!(l>n));//!false=ture
System.out.println(!(l<n));//!ture=false
System.out.println(!!(l>n));//!!false=false
//&&双与
System.out.println((l>m)&&(l>n));//false && false=false
System.out.println((l>m)&&(l<n));//false &&true=false
System.out.println((l<m)&&(l>n));//true && false=flase
System.out.println((l<m)&&(l<n));//ture && ture=ture
//&&和&:最终结果一样; &&具有短路效果,左边是false右边不执行
//同理||和|:最终结果一样; ||具有短路效果,左边是ture右边不执行
int e=3;
int f=4;
//boolean b1=((e++ == 3) & (f++ == 4));//ture
//boolean b1=((e++ == 3) && (f++ == 4));//ture
//boolean b1=((++e == 3) & (f++ == 4));//4,5,false
boolean b1=((++e == 3) && (f++ == 4));//4,4,false
System.out.println("e:"+e);
System.out.println("f:"+f);
System.out.println(b1);
//位运算首先将数值转化为二进制
//&位与运算,有0 则0 ;
//|位或运算,有1则1;
//^位异或运算,相同则0,不同则1
//~按位取反,0变1,1变0
/*数值3
二进制:00000000 00000000 00000000 00000011
~111111111 11111111 11111111 11111100(补码)
补码:111111111 11111111 11111111 11111100
反码=补码-1:11111111 11111111 11111111 11111011
原码(反码的符号位不变,其他位取反):10000000 00000000 00000000 00000100
结果是:-4
*/
//^位异或特点:一个数据对另一个数据位异或两次,该数本身不变、
/*
用异或实现a,b两数交换
方法一:面试
a=a^b;
b=a^b;//a^b^b=a
a=a^b;//a^b^a=b
方法二:一句话搞定(了解)
b=(a+b)-(a=b);
方法三:开发使用
int c = a;
a = b;
b = c;
*/
//<<:左移 丢弃左边,右边补0;即把<<左边的数据*2的移动次幂
System.out.println(3<<2);//3*2^2=12
/*
计算3的二进制
00000000 00000000 00000000 00000011(正数原码即反码)
(00)000000 00000000 00000000 0000001100
*/
//>>:右移 最高位是0,左边补齐0;最高位是1,左边补齐1;即把>>左边的数据/2的移动次幂
//>>>:无符号右移 无论最高位是1还是0,左边补齐0;
System.out.println(24>>2);//24/2^2=6
System.out.println(24>>>2);//6
System.out.println(-24>>2);
System.out.println(-24>>>2);
/*
* >>的移动
计算24的二进制 :11000
-24的原码:10000000 00000000 00000000 00011000
-24的反码:11111111 11111111 11111111 11100111
-24的补码:11111111 11111111 11111111 11101000
右移 :1111111111 11111111 11111111 111010(00)补码
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
>>>的移动
计算24的二进制 :11000
-24的原码:10000000 00000000 00000000 00011000
-24的反码:11111111 11111111 11111111 11100111
-24的补码:11111111 11111111 11111111 11101000(正数,原补码相同)
右移 : 0011111111 11111111 11111111 111010(00)
结果:1073741818
*/
//例题:2*8==2<<3
//三目运算符
/*(关系表达式)?表达式1:表达式2;
若关系表达式为ture,运算结果为表达式1
若关系表达式为false,运算结果为表达式2
*/
/*
获取三个数中的最大值,除了常规的两步判断外
一步搞定:int max=(a>b)?((a>c)?a:c):((b>c)?b:c);//先判断a>b在继续往后
*/
}