文章目录
- 一 运算符
- 1.1 算术运算符
- 当两个不同类型的值相加时:
- / 运算符
- %运算符
- 1.2 关系运算符
- 1.3 逻辑运算符
- 短路:
- 逻辑非
- 1.4 位运算符
- &
- |
- ^
- 位运算符当作逻辑运算符中使用
- ~
- >>
- <<
- >>>
- 1.5 赋值运算符
- 1.6 三目运算符
一 运算符
1.1 算术运算符
算术运算符有以下几种:+ - * / %
当两个不同类型的值相加时:
当两个不同类型的值进行相加时,较小类型的值其类型会自动转换成较大类型。
代码:
byte a = 2;int b = 5;int c = a+b;System.out.println(c);
byte b1 = 5;int i = 5;byte b2 = b1+i;System.out.println(b2);
因为变量b1与i相加,首先b1自动转换类型为int ,然后b1+i的值为int类型,赋给byte类型b2,没有强制类型转换操作符,所以报错!
/ 运算符
当除数为0时:
int a = 10/0;System.out.println(a);
输出结果显示异常,其提示是因为/ by zero,即除以0的原因。
整数与整数之间相除,结果取整,对于小数部分则丢弃
int a = 5;byte b = 2 ;System.out.println(a/b);
整数与浮点数相除,结果为小数
int a = 5;double d = 2.0;System.out.println(a/d);System.out.println(d/a);
%运算符
%运算符的右操作数亦不能为0
int b = 8%0;System.out.println(b);
整数与整数之间的取模,结果依然为整数,为正整数还是负整数取决于操作数的符号
int a = 5;int b = 2;int c = -2;System.out.println(a%b);System.out.println(a%c);//正数对负数取模int a2 = -5;System.out.println(a2%b);//负数对正数取模
整数与浮点数之间的取模,结果为浮点数,为正数还是负数,亦取决于操作数的符号
int a2 = 5;float f1 = 2.0f;System.out.println(a2%f1);
浮点数与浮点数之间的取模结果依然是浮点数,结果的符号,取决于操作数的符号
double d1 = -5.0;double d2 = 2.0;System.out.println(d1%d2);
1.2 关系运算符
关系运算符: > , < , == , >= , <=,!=
关系运算符与操作数组成的表达式为关系表达式,关系表达式的结果是布尔类型,值有两种,true与false
因此关系表达式是布尔表达式的一种。
举例:
int a = 10;int b = 5;boolean b1= a>b ;System.out.println(b1);
1.3 逻辑运算符
逻辑运算符有:&& 逻辑与 || 逻辑或 !逻辑非
//&&的逻辑是两边的布尔表达式的结果都为true,则此逻辑表达式的结果为true,否则结果为false。
int a = 10;int b =5;boolean b1 = a>b&&10>0;System.out.println(b1);
|| 逻辑或
此运算符的逻辑是,两边的布尔表达式的结果均为false,此逻辑表达式的结果才为false,否则结果为true
int a = 10;int b =5;boolean b1 = a>b||10<0;System.out.println(b1);
短路:
在java中的短路与c语言中的短路是一样的,这里再系统阐述一下:
对于逻辑与 与 逻辑或 操作符的特性//提出了短路的思想//对于逻辑与操作符 ,如果左边的布尔表达式的结果为false,则此逻辑表达式的结果一定为false,所以右边的布尔表达式就不需要再//计算了,也不会再计算//这样是为了节省资源,减少不必要的执行
int a =10;int b =5;// boolean b2 = 10/0>5; //这样会报警告boolean b1 = a<b&& 10/0>5;//这个算式不会,原因就在于后面的表达式根本就没有执行!System.out.println(b1);
int a = 6;int b = 4;boolean b1 = a>b|| 10/0>5;System.out.println(b1); //此时不会报警告,因为第一个布尔表达式值为true,所以第二个布尔表达式不会执行//也就不会报警告
逻辑非
此运算符的作用是用于改变布尔表达式的值,如果是false,则变为true,如果是true,结果是false
System.out.println(!false);System.out.println(!true);System.out.println(! (10>0));
1.4 位运算符
位操作符& 按位与| 按位或^ 按位异或~ 按位取反<< 左移二进制位>> 右移二进制位>>> 无符号右移动二进制位
&
& 按位与// 按位与的操作数有两个,针对的是操作数的二进制位// 运算规则为,如果两个操作数对应的二进制位均为1,则结果对应的位为1,否则为0
byte a = 2;byte b = 3;//2 的二进制位为 ://0000 0010// 3 的二进制位为://0000 0011//则两个数的按位与结果为://0000 0010 转换为十进制,结果为2System.out.println(a&b);
//针对按位与的特性,可以得出两个结论//一个数 按位与 其本身,结果还是其本身// 一个数 按位与 0 ,结果还是0 ;
|
// |按位或//按位或的操作数有两个// 其运算规则为:如果两个操作数对应的二进制位均为0,则结果的该位为0,否则结果的该位为1
byte a1 = 2;byte b2 = 3;// 0000 0010// 0000 0011//结果://0000 0011 ——转换为十进制,结果为3。System.out.println(a1|b2);
// 对于按位或的规则,我们可以得出结论://一个数按位或其本身,结果还是其本身
^
// ^ 按位异或 按位异或也是二进制运算符,其操作数有两个
// 其运算规则是,将两个操作数对应的二进制位进行比较,如果相同,则结果中该位为0,不同该位为1
byte a1 = 3;byte b1 = 5;// 3 的二进制:0000 0011// 5 的二进制:0000 0101//3^5 的结果: 0000 0110 ——转换为十进制为6System.out.println(a1^b1);
// 一个数 按位异或 其本身,则结果为0// 一个数 按位异或 0,则结果为其本身
位运算符当作逻辑运算符中使用
//1 按位与可当作逻辑与操作符,二者的差别在于前者没有短路
System.out.println(3>0&4>0);System.out.println(3>0&10/0>1);
// 按位或可当作逻辑或操作符,二者差别在于前者没有短路
System.out.println(3<0|5>3);System.out.println(3>0|10/0>2);
~
//按位取反的操作数与其他位运算符不同,操作数只有1个//其运算规则是将一个数的二进制位全部取反,即将1变成0,将0变成1
byte a3 = 5;// 0000 0101//按位取反的结果:~5:// 1111 1010 -- 这是补码// 1000 0101 — 转换成原码// 结果为 - 6System.out.println(~a3);
>>
//>> 操作符//>>运算符的操作数有两个,运算规则是将左操作数的各个二进制位向右移动右操作数值位,// 符号位由原来符号补上
byte a = 2;// 0000 0010//a>>1// 0 0000 001 //0补上原符号位//0000 0001System.out.println(a>>1);byte a2 = - 3;//1000 0011 --原码//1111 1101 --补码//右移一位,符号位不变//1 1111 110//1111 1110--补码//1000 0010-- 原码 结果为-2System.out.println(a2>>1);
<<
// << 运算符的操作数亦有两个,运算规则是将左操作数的各个二进制位向左移动右操作数数值位,空出的位补0
byte a1 = 3;/*0000 0011a1<< 1000 0011 00000 0110 ————转化为十进制为:6*/System.out.println(a1<<1);byte b1 = -3;// 1000 0011-- 原码// 1111 1101 -- 补码// 111 1101 0 ---左移一位补0// 1111 1010 --补码// 1000 0110 结果为-6System.out.println(b1<<1);
>>>
// >>> 此运算符与>>运算符的不同之处在于>>>运算符是无符号右移,即补符号位时,只补0
byte a1 = -3;// 1000 0011 -----原码// 1111 1101 ------补码//a1>>>1 无符号右移一位// 0 1111 110//0111 1110 结果为:126System.out.println(a1>>>1); System.out.println(Integer.MAX_VALUE);
//出现这个结果说明,变量在无符号右移时,自动转化成int类型
1.5 赋值运算符
= ,+=,-= ,/= ,%=
// 赋值运算符// 赋值运算符 =byte a = 5; //意为将5赋值给变量a// +=a+=5;//a+=5,是一种简写,展开为://a = a+5 ;// -=a-=3;//同理,展开为:a =a-3;//*=a*=3;//同上,展开为:a=a*3;// /=a/=2;//同上,展开为:a=a/2;//%=a%=2;//同上,展开为:a = a%2;
1.6 三目运算符
布尔表达式 ?表达式:表达式
三目运算符共有三个操作数,其运算规则是先判断?之前的布尔表达式的值为true还是false,如果为true ,
则执行 :之前的表达式,如果为false,则执行 :之后的表达式。
// 三目运算符int c= 5>0?3:2;System.out.println(c);