java运算符
无论哪门语言都会有运算符,用来做数学及逻辑运算,java中大致有以下六种运算符
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
算术运算符
操作符 | 描述 | 实例 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(区别详见下文) |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(区别详见下文) |
看完表格内的内容,我们继续看下面的代码
public static void main(String[] args) {
int a = 1+1; // 2
int b = 1-1; // 0
int c = 2*2; // 4
int d = 4/2; // 2
int e = 5%2; // 1
List list = Arrays.asList(a,b,c,d,e);
System.out.println(list);
}
输出结果: [2, 0, 4, 2, 1]
很好理解吧?我们再来看自增和自减如何理解
public static void main(String[] args) {
int i = 0;
System.out.println(i++);
System.out.println(++i);
}
先来看一下,上述代码,猜猜输出什么?这里新手可能会蒙圈,这个++写在前后有什么区别呢?
先给出结果:
public static void main(String[] args) {
int i = 0;
System.out.println(i++); // 输出0
System.out.println(++i); // 输出2
}
这里懂的人就懂了,不懂的人可能要思考半天,为什么i++输出0?而不是1呢?为啥++i输出的不是1而是2呢?
emmmm,好吧,我们来讲解一下,首先要搞明白,这个++放在变量i前后是干啥用,有什么区别??
放在变量前,譬如++i表示,先进行自增,再干其他事情,比如运算或者输出等等。。而放在变量后,譬如i++,聪明的你们应该懂了,应该是先进行运算或输出,然后再进行自增。
代码解析:
- 声明变量i并赋值为0
- 先进行输出,此刻i还是0,没有进行自增操作,所以输出了0
- 输出完毕,在内存中把i进行了自增,此时i变为了1
- 再次进行输出,不过在输出之前,先把i进行了自增,此时i变成了2
- 输出i,此时i是2,所以输出了2
这样应该懂了吧!再不懂我就无力解释了!自减不用我说了吧,道理是一样的。
关系运算符
关系运算符用来描述两个变量之间的关系。
操作符 | 描述 | 实例 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A > B)为假 |
< | 查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A < B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A>= B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A<= B)为真 |
这里就不贴代码了吧,很简单,学过小学数学的人都懂。如果你说你不懂,那我劝你不要学习代码了。。
位运算符
操作符 | 描述 | 实例 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
练习可参考下面的代码
public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c );
c = a << 2; /* 240 = 1111 0000 */
System.out.println("a << 2 = " + c );
c = a >> 2; /* 15 = 1111 */
System.out.println("a >> 2 = " + c );
c = a >>> 2; /* 15 = 0000 1111 */
System.out.println("a >>> 2 = " + c );
}
输出结果如下
a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 2 = 15
a >>> 2 = 15
逻辑运算符
操作符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false | !(A && B)为真 |
参考如下代码
public static void main(String[] args) {
int a = 0;
int b = 1;
int c = 2;
boolean d = true;
boolean f = false;
System.out.println(a == 0 && b == 1); // 两边全为真,则输出true
System.out.println(d && f); // 有一个为假,则为假,输出false
System.out.println(d | f); // 有一个为真,则为真,输出true
System.out.println(!(c==2)); // 若括号内计算为真,则取反,则为假,输出false
}
在这里还有个要注意的地方就是,&和&&的区别 ,&和&&均表示逻辑与,不过&&有个更特殊的称号叫做“短路与”,那么什么叫“短路与”,“短路”又是什么意思呢?先来看下面的代码
public static void main(String[] args) {
int a = 0;
int b = 0;
System.out.println(a != 0 & ++a == 1);
System.out.println(b != 0 && ++b == 1);
System.out.println("进行运算后,输出a的值为"+a);
System.out.println("进行运算后,输出b的值为"+b);
}
输出结果:
false
false
进行运算后,输出a的值为1
进行运算后,输出b的值为0
为什么此时a和b都进行了自增运算,但是b却为0呢?两段代码除了&和&&的区别,其他都是一模一样的,那么真相只有一个,问题肯定就是出在&和&&的区别上,联想一下之前提到的“短路”,“短路”是物理学中的一个概念,意思是一条电路通了,就不会去走另外一条了(物理渣解释的可能不到位,不要纠结),那么这里也是一样的,“短路与”&&只要第一个值是false,那么后面直接放弃运算!因为逻辑与只要有一个为假则为假,后面的也没必要进行运算了,所以,此刻++b并没有执行该代码,b保持原有的值0不变。
赋值运算符
操作符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
实例代码如下
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 0;
c = a + b;
System.out.println("c = a + b = " + c );
c += a ;
System.out.println("c += a = " + c );
c -= a ;
System.out.println("c -= a = " + c );
c *= a ;
System.out.println("c *= a = " + c );
a = 10;
c = 15;
c /= a ;
System.out.println("c /= a = " + c );
a = 10;
c = 15;
c %= a ;
System.out.println("c %= a = " + c );
c <<= 2 ;
System.out.println("c <<= 2 = " + c );
c >>= 2 ;
System.out.println("c >>= 2 = " + c );
c >>= 2 ;
System.out.println("c >>= 2 = " + c );
c &= a ;
System.out.println("c &= a = " + c );
c ^= a ;
System.out.println("c ^= a = " + c );
c |= a ;
System.out.println("c |= a = " + c );
}
输出结果如下:
c = a + b = 30
c += a = 40
c -= a = 30
c *= a = 300
c /= a = 1
c %= a = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a = 0
c ^= a = 10
c |= a = 10
条件运算符
没错,这个条件运算符就是大名鼎鼎的三目运算符,该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
variable x = (expression) ? value if true : value if false
我们来实操一下
public static void main(String[] args) {
String s1 = 1>0 ? "1>0为真":"1>0为假";
String s2 = 1<0 ? "i<0为真":"1<0为假";
System.out.println(s1);
System.out.println(s2);
}
输出结果如下:
1>0为真
1<0为假
当?前的表达式为真,则将?后第一个值赋值给s1,当?前的表达式为假,则将?后第二个值赋值给s2。
这样用的好处就是更加方便,不然你就得写一个if去判断然后赋值。
以上就是所有关于java运算符的知识,To Be Continue!