个人认为运算符常见的一些简单问题
开篇都是这一句,见谅!由于本人是个初学者希望自己的文章不会误导广大“群众“,如果有错误之处还望前辈指出。谢谢!
一、扩展的运算符(+= ,-= ,*= ,/=,%=)的一个小问题:存在强制类型的转换。
short s=1;s = s+1;
short s=1;s+=1;
上面两个代码有没有问题,如果有,那里有问题。
第一个有问题,第二个没有问题。
因为:第一行代码里s为指定的string类型,s+1有一次类型转换,变成了int类型,再赋值给short类型的时候会报错显示损失精度。然而扩展的赋值运算符其实隐含了一个强制类型转换。
s += 1;
不是等价于 s = s + 1;而是等价于 s = (s的数据类型)(s + 1);因而编译运行成功。
二、比较运算符:
==,!=,>,>=,<,<=
特点:无论你的操作是简单还是复杂,(结果都是boolean类型!!!!。)
//boolean flag = (a == b);
//boolean flag = (a = b); //这行代码是有问题的,不兼容的类型;里面不是比价运算符,而是赋值运算符。因此=不要与==混淆。
//System.out.println(flag);
三、逻辑运算符:&,|,^,! ,&&,||
&&和&的区别? 同理||和|的区别?
A:最终结果一样。
B:&&具有短路效果。左边是(false),右边不执行。
||具有短路效果。左边是(true),右边不执行。
举例:
int x = 3;
int y = 4;
boolean b1 = ((++x == 3) && (y++ == 4));//(4==3flase)已经错误,后边的不再执行。如果输出的话:x=4,y=4,b1=flase
boolean b2=((++x==4)||(y++==4);//(++x==4)已经正确,后边的不再执行。如果输出的话:x=4;y=4;b2=true
四、位运算符:& | ~ ^ >> << >>>
临时有事,明天有空接着写,嘿嘿。谢谢观看和补充O(∩_∩)O
期末考试结束,代码撸起来!
要做位运算,首先要把数据转换为二进制。
例如:求~3和~4: 对补码的格式进行按位取反,而我们看到取反后的数值是原码格式
3的二进制:
00000000 00000000 00000000 00000011 原码=补码
~ 11111111 11111111 11111111 11111100 补码
11111111 11111111 11111111 11111011 反码
10000000 00000000 00000000 00000100 原码 这里是我们看到的结果:-4
^的特点:一个数据对另一个数据位异或两次,该数本身不变。例如:a ^ b ^ b 结果a的值不变
<<:左移 左边最高位丢弃,右边补齐0 >>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1 (是啥补啥) >>>:无符号右移 无论最高位是0还是1,左边补齐0
<< 把<<左边的数据乘以2的移动次幂:3 << 2=3*2^2=12; >> 把>>左边的数据除以2的移动次幂:24 >> 2=24/(2^2)=6
*-24 >> 2 :
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
数据是对补码操作
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) 补码
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
屏幕显示的原码形式
原码:1000000000 00000000 00000000 000110
结果是-6
五、三目运算符: 比较表达式?表达式1:表达式2;结果是一个boolean类型的数据,执行流程:先看表达是正确与否;正确执行表达式1,错误执行表达式2
判断大小:int max = a>b?a:b;
System.out.println("两个数较大的数是:"+max);
//比较三个数的较大的值
int c = 12;
//int flag;常常用temp做为临时变量,flag用作boolean类型中常见
int temp = a>b?a:b;
int max1= c>temp?c:temp;
System.out.println("三个数较大的数是:"+max1);
}
}