关于运算符,我直接用代码加注释进行一天的总结:
直接上代码吧:
// An highlighted block
/*
运算符测试
举例说明
*/
public class TestOperator {
public static void main(String[] args) {
/* 二元运算符+ - * / %
二元运算符规则
1、两个操作数有一个是long,则结果是long
2、没有long时,结果是int,即时操作数全是short或byte,结果也是int
3、两个操作数有一个是double,结果是double
4、只有两个操作数都是float,结果才是float
5、两个操作数有一个是double,结果是double
6、+ - * / 中,想得到结果为浮点数,就需要有浮点数进行参与
7、表达式的类型提升 在参与运算时short,byte,char将自动被提升为int 之后自动提升规则int->long->float->double
*/
//整数类型
byte a = 1;
int b = 2;
//byte c = a+b;//报错,因为a+b是int型
long b2 = 3;
//int c2 = b2+b;//报错,有一个操作数是long,结果也是long,所以报错
long a5 = a + b + b2;
System.out.println(a5);
System.out.println("----------");
//浮点数类型
float f1 = 3.14F;
float d = b+b2;//这样是可以的,范围允许
double d2 = b+b2;//这样也是可以的
//float d3 = f1+d2;//这样是不行的,有一个double,结果就是double
System.out.println(d);
System.out.println(d2);
float f2 = 3.86F;
float f = f1 + f2;
System.out.println(f);
System.out.println("----------");
//取模运算,结果的符号与左边的操作数相同
System.out.println(7/3);
System.out.println(-7/3);
System.out.println(7/-3);
//常见错误
short s = 8;
//short s = 8 + s; 产生错误,8是int型,赋值给short将产生精度损失,错误。
s+= 2; // 相当于s = (short)(s + 2)
System.out.println("s的值为:" + s);
short s2 = 5;
short s3 = 9;
//short s4 = s2 + s3; 将产生错误,原因是在参与运算时short,byte,char将自动被提升为int,左边为int范围大于short错误。
short s4 = (short)(s2 + s3);
System.out.println("s4的值为:" + s4);
System.out.println("----------");
//自增自减 ++ --
int a1 = 3;
int b1 = a1++;//先赋给b值3,再运算++
System.out.println("a1="+a1+"\nb1="+b1);
int a2 = 3;
int b4 = ++a2;//先赋给b值3,再运算++
System.out.println("a2="+a2+"\nb4="+b4);
System.out.println("----------");
//常见问题
int m1 = 10;
int n1 = m1++;//先将m1赋值给n1,n1=10,之后m1加一m1=11
System.out.println("n1的值为:" + n1);//n1=10
System.out.println("m1的值为:" + m1);//m1=11
int m2 = ++m1;//先将m1加一, m1=12再赋值给m2 m2=12
System.out.println("m2的值为:" + m2);//m2=12
int n2 = m1++ + 2;//由于 + 号的优先级大于 ++, 则先进行加法运算n2=14.之后m1进行加一m1=13.
System.out.println("m1的值: " + m1);
System.out.println("n2的值: " + n2);
System.out.println("----------");
/* 赋值运算符(隐含了强制类型转换) 使用规则
1.= 赋值 a=10,将10赋值给变量a
2.+= 加后赋值 a+=b,将a+b的值给a
3.-= 减后赋值 a-=b,将a-b的值给a
4.*= 乘后赋值 a*=b,将a×b的值给a
5./= 除后赋值 a/=b,将a÷b的商给a
6.%= 取余后赋值 a%=b,将a÷b的余数给a
*/
int y = 5;
y+= 3;
System.out.println("y的值为: " + y);
//扩展运算符
/*
a+=b -> a=a+b
a*=b+3 -> a=a*(b+3)
*/
int g = 3;
int h = 4;
g+=h;
System.out.println("g="+g+"\nh="+h);
g=3;
g*=h+3;
System.out.println("g="+g+"\nh="+h);
System.out.println("----------");
//三元运算符 格式:关系表达式 ? 表达式1 : 表达式2; 关系表达式为真(true),输出表达式1;关系表达式为假(flase),输出表达式2.
int m = 5;
int n = 3;
int max = m > n ? m : n;
System.out.println("最大值为: " + max);
System.out.println("----------");
/* 逻辑运算符
&(与) |(或) !(非) ^(异或)
短路逻辑运算符
&&(与)||(或) 短路逻辑运算符与逻辑运算符区别:短路逻辑运算符,左边的条件如果为假(false),则不执行右边;左边的条件如果为真(true),则执行右边;
程序相比于之前的效率更高;
逻辑运算符,左边的条件不论真假,右边都执行。
*/
int x = 8;
int k = 6;
int max1 = x > k ? x : k;
System.out.println("最大值为:"+ max1);
boolean o = x >= k;
System.out.println("是否为真:"+o);
//常见问题 运算符之间的顺序
int p = 5;
boolean flag = (p++ > 5) && (++p > 5);/* 首先将p的值输入,后进行比较,发现左边条件不成立,则输出false,
由于使用的的是短路与运算符,左边错误,右边条件不运行,则p只自增一次p = 6 */
System.out.println("输出p: " + p);// 6
System.out.println("输出flag: " + flag);// false
flag = (p++ > 5) || (++p > 5);/* 首先将p的值输入,后进行比较,发现左边条件成立,则输出true,
由于使用的的是短路或运算符,右边输出true,则右边条件不运行,则p只自增一次p = 7 */
System.out.println("输出p: " + p);// 7
System.out.println("输出flag: " + flag); // true
}
}