以下代码皆在eclipse内进行操作
1.同种类型参与运算(可能发生自动类型转换),得到同种类型的数据.
int a = 1;
int b = 2;
int c = a + b;//3
/*
此时不会发生自动类型转换,也不会报错,因为a与b都是整型,所以得到的结果也是整型,
所以可以将结果赋值给C.
*/
2.不同种类型参与运算,得到数据范围较大的类型.
运算符 | 含义 | 实例 | 结果 |
+ | 1.加法 2.正号 |
1. 1+8 2. +1 |
1. 10 2. 1 |
- | 1.减法 2.负号 |
1. 5 -3 2. int a = 1; -a |
1. 2 2. -1 |
* | 乘法 | 2 * 4 | 8 |
/ | 除法 | 4 / 2 | 2 |
% | 求余数(仅限整数) | 9 % 2 | 1 |
1.先取余数和乘除,后加减,有括号则括号优先;
2.整数除数不能为0;
3.浮点型除数若为0.0,则结果为无穷大,如1 / 0.0;
++a:先进行a+1,然后将a+1的值作为整个表达式的值.
--a:先进行a-1,然后将a-1的值作为整个表达式的值.
a++:先将a的值作为整个表达式的值,然后在进行a+1的操作.
a--:先将a的值作为整个表达式的值,然后再进行a-1的操作.
一般情况下,"+"会用来做字符串的拼接.
如:
很明显在这里它都是做的字符串的拼接,尤其是第二十行的代码,我们可以发现在这里时系统也没有对246和78做加法运算,而是字符串拼接.
这个就很简单啦,就是在Java中表示赋值就是用"=",如果是等于就用"==".
*注意:
a=a+b可以写成a+=b,同理可得还有a*=b,a/=b,以及a%=b;
得到的答案是7,a+=b不是等同于a=a+b嘛,然后赋值符号"="是具有右结合性的,即先进行右边的运算,此处就是先进行a+b,然后将a+b得到的结果再赋值给a.
关系运算符用来比较两个数的大小,结果的返回值为boolean类型.
运算符 | 含义 | 示例 | 结果 |
== | 等于 | 1 == 2 | false |
!= | 不等于 | 1 != 2 | true |
< | 小于 | 1 < 2 | true |
> | 大于 | 1 > 2 | false |
<= | 小于等于 | 3 <= 3 | true |
>= | 大于等于 | 3 >= 3 | true |
逻辑运算符的两端只能是返回值为boolean型的表达式,其结果也是boolean型.
运算符 | 含义 | 示例 | 结果 |
&&(双位与) | 两端都为true才为true,否则为false | (1 < 2) && (8 < 5) | false |
||(双位或) | 两端都为false才为false,否则为true | (1 < 2) && (8 < 5) | true |
!(非) | 将true变成false,将false变为true | !(1 < 2) | false |
另外双位与和双位或具有短路性质,即
如果是双位与,前面一端如果已经确定了为false,那么就不会再对后面一段的表达式进行判断,直接将false作为整个表达式的结果.
而如果是双位或,前面一端如果已经确定了为true,那么就不会再对后面一段的表达式进行判断,直接将true作为整个表达式的结果.
由于双位与和双位或的短路性质,就会有一个例子的产生;
System.out.println(1 > 2 && 1 / 0),这个输出的结果就是false但事实上,后面那个1 / 0是错的,系统应该报错,但是因为它的短路性质就直接输出false了.
位运算符两端既可以是返回值是boolean类型的表达式,也可以是数值.
(1)如果两端都是Boolean表达式,则跟双位与用法相同,只不过按位与不具备短路性质.
(2)如果两端都是数值,则如果对应位都是1,则结果才为1,否则为0;
举例: 12 & 15
首先将12与15都转换成二进制,12:1100,15: 1111;
然后再进行与运算: 1100
1111
结果 1100
观察对应位置,全为1才为1,所以结果是1100,转换成10进制就是12,所以最终输出结果为12.
(1)如果两端都是Boolean表达式,则跟双位或用法相同,只不过按位或具备短路性质.
(2)如果两端都是数值,则如果对应位都是0,则结果才为0,否则为0;
举例: 12 | 15
首先将12与15都转换成二进制,12:1100,15: 1111;
然后再进行与运算: 1100
1111
结果 1111
观察对应位置,全为1才为1,所以结果是1111,转换成10进制就是15,所以最终输出结果为15.
(1)如果两端都是Boolean表达式则两端如果都是true或flase,则结果位flase,否则为true.
(2)如果两端都是数值,则如果对应位都是0或1,则结果才为0,否则为1;
举例: 12 ^ 15
首先将12与15都转换成二进制,12:1100,15: 1111;
然后再进行与运算: 1100
1111
结果 0011
观察对应位置,全为1才为1,所以结果是0011,转换成10进制就是3,所以最终输出结果为3.
(1)这个运算符如果后面接的是boolean表达式,则如果接的是返回值为true的表达式,就将false作为整个表达式的最终结果,如是接的是false,则将true作为整个表达式的最终结果.
(2)如果接的是数值,则将数值的每一位都按位取反.
举例: 12
首先将12转成二进制位01100;
然后再进行运算取反运算: ~ 01100
首先我们需要明白
正数的原码=反码=补码
而
负数的反码=符号位不变,其它位全部按位取反,
负数补码=反码+1
再进行运算将01100全部取反变成10011(最高位是符号位)但是这还只是补码,所以要减1来变成反码为10010,然后再将它变成原码,反码符号位不变,然后其它位全部取反,就变成了11101,转成十进制就是-13.
至于为什么这么做,我到网上搜了,有一个帖子是这么说的,01100取反后,由于计算机内是以补码的形式储存的,所以还要将补码变成原码,而补码和原码之间的联系就是反码,所以要取反了再通过反码得到原码.
帖子链接:
https://blog.csdn.net/zyh201314zyh/article/details/114294827
这个博主还告诉了我们一个小公式:(~x) = -(x + 1).
举例子来讲述它的用法吧.
12 << 1 //左边的数值就是你要移位的对象,右边就是你要移的位数
这个就是要将数值12左移一位.
(1)首先将12转成二进制形式是01100,所有的1和0都向左移一位,末位补0,就变成了011000,变成十进制就是24.
(2)可以直接采用公式,要将12左移一位,就将12*2得到结果为24,如果是两位就将12*2*2,得到结果为48.左移n位就将移位对象乘以2的n次方.
也用例子来讲述吧.
12 >> 1 //左边的数值就是你要移位的对象,右边就是你要移的位数
这个就是要将数值12右移一位.
(1)首先将12转成二进制形式是01100,所有的1和0都向右移一位,最高位补0,就变成了00110,变成十进制就是6.(记住如果最高位一开始是1移位后就补1,如果是0,就补0)
(2)可以直接采用公式,要将12右移一位,就将12/2得到结果为6,如果是两位就将12/2/2,得到结果为3.右移n位就将移位对象除以2的n次方.
这个运算符与右移运算符的唯一区别就是它不管最高位的符号位,也就是最高位一律补0.
*如果移位超过其数据类型占位大小,那么便取余来移位.
举个例子来说,如果是int a = 12;
现在a << 33,我们知道int类型占位只有32,很明显它超过32位,那么现在a向左移1位,因为33 % 32 的结果为1,所以a实际上只左移了移位.
图片来自于网络
如果有错误,希望各位大佬告知,万分感谢!!!