版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LoveRong521/article/details/82317079
Date:8.29
运算符:
字符串拼接符号:+,该符号的左右任一方有字符串,则这个符号就是拼接字符的效果;
boolean b=true;
int a=10;
float f=1.0f;
System.out.println("b="+b); 结果:--b=true
System.out.println("x="+x);
System.out.println("f="+f);
算术运算符:+加、 -减 、 *乘、 /除 、 %取余 、 ++自加 、 --自减
加号:注意,防止+符号左右出现字符串,否则该符号就是拼接而非加法运算;
class YSF{
public static void main(String[] args){
int x=15;
System.out.println("x+1="+(x+1));
}
}
减法:注意,优先进行减法运算,再拼接结果;
class YSF{
public static void main(String[] args){
int x=15;
System.out.println("x+1="+(x-1));
}
}
乘号:*
注:在数学中 4a,但是在计算机中必须写出乘号 4*a
除号:/
注:不允许出现除数为0,但计算机中会报异常-除数为零异常(Error/Exception)
例:
class YSF{
public static void main(String[] args){
int x=15;
System.out.println(x/0);
}
}
以下是执行完上面代码后的异常信息:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at YSF.main(Demo1.java:15) 在Demo1.java文件中,第15行有错;
%:取余,取余数
例:判断奇偶性;取出一个随机范围;
注:取余时,结果的正负取决于被除数的正负号;
例:
int x=8;
System.out.println(x/3);//2
System.out.println(x%3);//2
System.out.println(x/(-3));//-2
System.out.println(x%(-3));//2
System.out.println((-x)/3);//-2
System.out.println((-x)%3);-2
System.out.println((-x)/(-3));//2
System.out.println((-x)%(-3));//-2
++:自加,每次自加1
例:int x=1; x++; x是多少?2
int x; x++; x是多少?错误,变量没有初始化;
x++和++x的区别;
int x=1;
//单独使用++x和x++,没有区别,都是+1操作;
//x++;
//++x;
//当x++和++x使用在别的语句中的时,x++和++x的区别:
//x++:先使用原来的值,再执行加1
//++x:先给原值加1,再使用;
//System.out.println(x++);//1
//System.out.println(++x);//2
例:int x=10;
计算:(x++)+(++x)+(++x)+(x++)+(x++),问最终和是多少?x的值是多少?
括 10 12 13 13 14 和62
加1 11 12 13 14 15 x=15
--:累减,每次减1;
例:int x=1; x--; x是多少?0
int x; x--; 报错,变量没有初始化;
计算:x=10
(x++)+(++x)+(++x)+(x++)+(x++)+(--x)+(x--)+(x++),最终和是多少?x的值是多少?
10+12+13+13+14+14+14+13=103
x=14
赋值运算符:
=:赋值符号,将右边的变量或常量值赋值给左边的变量;
例:int x=1;
+=、-=、*=、/=、%=:左右两边的值进行运算,再将结果赋值给左边变量;
例:赋值
int x=1;
x+=1;//相当于 x=x+1,也等价于x++或++x
左右两边的变量相运算
int x=1,y=2;
x+=y;//相当于x=x+y
右边的整体表达式与左边变量相运算
int x=3,y=2;
//x+=y;
x*=y+3;
System.out.println("x="+x+"\ty="+y);//x=15 y=2
关系运算符:> 大于、 <小于 、 >=大于或者等于 、 <=小于或者等于 、 ==等于 、 !=不等于
注:关系运算符的结果都布尔类型(true或false)
逻辑运算符:&&与(且) 、 ||或、!非 、 &与(位) 、 |或(位) 、 ^异或(位)
例:int x=10,y=20;
x>y 当x大于y时
!(x>y) 当x小于或等于y时,等价于 x<=y
与(位):对应两个数的二进制位值都为1时,结果的该位也是1;
例:3&4
0011
0100
———————
0000
或(位):对应两个数的二进制位值只要任一方为1时,结果的该位也是1;
例:3|4
0011
0100
———————
0111
异或(位):对应两个数的二进制位值只要不同,结果的该位是1;
例:3^5
0011
0101
———————
0110
位运算符: ~ 、 >> 、 << 、 >>>
~取反
规律:-(数+1)
正数:-(原正数+1)
负数:-原数-1
注:正数的原码、反码、补码都一样;计算机中存储数据是按补码存放;
原码:二进制表示
反码:除符号位,将原码全部取反(0变1,1变0)
补码:在反码基础上再加1
数据类型 byte/short/int/long
字节数 1 2 4 8
位 8 16 32 64
例:96
二进制:0110 0000
原码、反码、补码:0110 0000
0110 0000 在计算机中存储
~(0110 0000)全部取反
1001 1111 --结果(补码)
补-->反-->原
补:1001 1111
反:1001 1110
原:1110 0001 -97
例: 119(-120) 100(-101) 58(-59)
100=64+32+4
0110 0100
1001 1011
补-->原
1110 0101 -101
练习: -49 -29 -119
-119
119-->0111 0111
-119-->1111 0111原
补:1000 1001
~:0111 0110原、补
结果:0111 0110 118
<<:左移位,相当于乘法;左移位一次乘以2;
>>:右移位,相当于除法,右移位一次除以2;保留符号位,负数的高位补1,正数的高位补0;
>>>:右移位,相当于除法,带着符号位向右移动,高位补0;
例:8>>>1结果:4 ;-8>>>1 结果:2147483644
-8>>1 -8>>>1
//原1000 1000
//补1111 1000
byte x=-8;
//原1000 0000 0000 0000 0000 0000 0000 1000
//补1111 1111 1111 1111 1111 1111 1111 1000
//移位01111 1111 1111 1111 1111 1111 1111 100
//2147483644
int res=x>>>1;//0
System.out.println(res);
x=-8;
//补:1111 1000
//移位:1111 1100
//反码:1111 1011
//原码:1000 0100 -4
res=x>>1;//0
System.out.println(res);
总结:
原码、反码、补码
正数的原、反、补码相同;
负数:反码是对原码除了符号位按位取反,补码是对反码加1;
计算机中存储补码;
~83
原:0101 0011
取反:1010 1100
1010 1011
1101 0100 -84
~(-93)
原:1101 1101
补:1010 0011
取反:0101 1100 92
>>和>>>区别?
>>符号位保留不变;
>>>符号位一起移位;
注:
两个byte、两个short相运算、byte和short运算,结果都是int;
//byte b1=1;
//byte b2=2;
//byte res=(byte)(b1+b2);//两个byte运算的结果是int类型
//short s1=1;
//short s2=2;
//short res=(short)(s1+s2);//两个short运算的结果是int类型
char和int相运算,结果将char自动转为ASCII码参与运算;
例:char c='a';
int res=10+c;//c里存储的字符的ASCII码
System.out.println(res);
三目运算符:? :
语法:表达式?结果1:结果2
解释:如果表达式结果为true,则执行结果1,否则执行结果2;
例:
public static void main(String[] args){
int x=10;
int y=2;
//String res=x>y?"true":"false"; //结果:true
boolean bb=x<y?true:false;//结果: true
System.out.println(bb);
}