Java运算符
运算符用来指明对于操作数的运算方式
(一)、按照运算符操作其运算的数目来进行分类
- 单目运算符(a++)
- 双目运算符(a+b)
- 三目运算符(a>b?a:b)
(二)、按照运算符的功能来进行分类 - 算术运算符(+ 、-、 *、 /、 %、 ++、 --)
int x = 1;//代码在栈内存空间中开辟了一个名字叫做x的空间,然后将常量区的1复制一份放入到x所在的空间。
x = x + 1;//先将x中的1取出来放入到一个临时空间,然后再将常量区中的1拷贝一份与临时空间的1相加,再放回到x所在的内存空间。
int x = 1;
y = x++;//x++相当于x=x+1;将变量空间的内容取出来,常量区取出1,进行计算,再次存回到空间。x想要做值交换的时候,会产生一个副本空间。(备份)
//如果++在前,先自增后备份。++在后,先备份后自增。
例如下列图片所示:
笔试题防坑指南例题:
int a = 1;
for(i = 0;i <= 100; i++){
a = a++;
}
system.out.println(a);//1
答案解析:此题并不是考察循环而是考察变量赋值问题。
首先声明一个a变量空间,然后将常量区的1复制一份到a空间,a++表示先备份然后自增,即先产生一个临时空间存储x空间的值然后x空间的值自增变为2,最后再将临时空间里面的值赋给x空间,因此将x空间的值给覆盖了变为了1。
- 赋值运算符
赋值符号 将=右边的内容(值 引用)存入=左边的内存空间中(+=、-=、*=、/=、%=)
其中赋值运算符有自动提升类型和自动转化的功能
例如:
byte x = 1;
x += 2;//自动类型提升和转化
x = x + 2; //编译出错,从int类型转化为byte可能会有损失
//上面解决方案:x = (byte)x + 2;
- 关系运算符
(>、>=、<、<=、!=、==、对象instanceof类)
1、=和==的区别
赋值符号(=):将后面的值或引用存入左边的变量空间
比较运算符(==):比较==前面与后面的值或引用是否一致
2、比较的结果最终是什么?
答:3>4;比较的结果是boolean类型。
- 逻辑运算
逻辑或(|)、逻辑与(&)、逻辑异或(^)、逻辑非(!)、短路与(&&)、短路或(||)
1、逻辑符的前后应该是两个boolean类型的结果
2、逻辑与前后两个条件必须同时满足才为true
3、逻辑或前后两个条件只要满足一个就为true
4、逻辑异或只要前后两个表达式的结果不同,最终为true
5、逻辑非将原来的结果取反
6、短路与前面的结果为false时,发生短路;短路之后的所有计算的过程。(即后面的表达式不会执行)
- 位(bit)运算
(按位与&、按位或|、按位异或^、按位取反~、按位左位移<<、按位右位移>>、按位无符号右位移>>>)
计算方法:
1、先将数值转化成二进制形式
2、竖着按照对应的位置进行计算
3、将计算后的二进制结果转换成十进制
知识补充:
原码、反码、补码(以二进制形式表示)
(1)原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
(2)反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
(3)补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
三连博主,每天分享一个编程小技巧!