
“嗨,比拉博!”
“比拉博很高兴迎接他的朋友!”
“今天 Bilaabo 将告诉您有关运算符优先级的信息。但首先他会告诉您有关运算符本身的信息。”
“你说的这些操作员是什么?”
“其实,你已经很熟悉了,只是你可能不知道,他们叫接线员。”
“例如,假设我们有表达式 c = a + b; ”
“它有两个运算符:一个加法运算符和一个赋值运算符。”
“也就是说,运算符就是数学符号?就像乘法、除法、加法一样?”
“是的,的确如此。不过,还是有区别的。”
“我不会为你定义运算符:一个定义不会让你更聪明。最好是看到它们的作用。运算符可以分为几组,我们现在将对其进行研究。”
1) “数学运算符”
象征 | 例子 | 姓名 | 描述(它做什么) |
---|---|---|---|
+ |
a + b |
加法运算符 | 加法运算符。 |
- |
c - d |
减法运算符 | 从第一个数字中减去第二个数字。 |
* |
a * t |
乘法运算符 | 将两个数字相乘。 |
/ |
a / b |
除法运算符 | 将第一个数字除以第二个数字。 |
% |
c % d |
将第一个数字除以第二个数字。 | 计算第一个数字除以第二个数字后的余数。 |
- |
-a |
一元减号 | 将变量的符号更改为相反的符号。 加到减,减到加。 |
+ |
+a |
一元加号 | 没有任何改变。这是为了补充一元减号运算符而添加的。就是为了好看 |
“我在学校认得这些。我的固件包括学校课程。”
“但是,那个百分号是怎么回事,是某种魔法吗?”
“就是‘除后余数’运算符,11除以5,则得到2和1的余数,这个1可以写成11 % 5;”
“当你在 Java 中除以整数时,结果也是一个整数。除法运算的余数被简单地忽略。如果我们用 8 除以 5,我们得到 1。”
表达 | 结果 | |
---|---|---|
19 / 10 |
1个 | 如果我们用 19 除以 10,结果是 1,余数是 9。 |
19 % 10 |
9 | 如果我们用 19 除以 10,结果是 1,余数是 9。 |
2 / 5 |
0 | 如果我们将 2 除以 5,则 结果为 0,余数为 2。 |
16 % 2 |
0 | 如果我们将 16 除以 2,则结果为 8,余数为 0。 |
“但我们到底要剩下的钱干什么?”
“假设你需要检查一个整数是否为偶数。那么你可以这样写:”
if (a % 2 == 0)
“如果你需要检查 b 是否奇数,那么你可以这样写:”
if (b % 2 == 1)
“或者检查 d 是否可以被 3 整除:”
if (d % 3 == 0)
“很有趣。我会记住的。”
2) “比较运算符”
象征 | 例子 | 姓名 | 描述(它做什么) |
---|---|---|---|
< |
a < b |
少于 | 检查a是否小于b。 |
<= |
c <= d |
小于或等于 | 检查 c 是否小于或等于 d。 |
> |
a > b |
比...更棒 | 检查a是否大于b。 |
>= |
c >= d |
大于或等于 | 检查 c 是否大于或等于 d。 |
== |
i == j |
等于 | 检查 i 是否等于 j。 |
!= |
a != 0 |
不等于 | 检查 a 是否不等于零。 |
“这些我都用过了。”
“这些运算符和数学运算符之间的主要区别是什么?”
“如果我们将两个数字相加,我们会得到一个数字;但是,如果我们比较两个数字,我们会得出真或假。”
“没错,比较的结果是一个‘逻辑值’值,如你所知,是用布尔类型表示的。有两种可能:真或假。
“是的,一切都清楚了。我已经知道了。”
3) “逻辑运算符”
象征 | 例子 | 姓名 | 描述(它做什么) |
---|---|---|---|
&& |
a && b |
和 | 只有当 a 和 b 都为真时,表达式的结果才为真。 |
|| |
c || d |
或者 | 如果 a 或 b 为真,则表达式的结果为真。他们两个或至少一个。 |
! |
!a |
不是 | 仅当 a 为假时,表达式的结果才为真。 |
“逻辑运算符只能与布尔变量或表达式一起使用。”
例子 | 描述 |
---|---|
boolean a = true; boolean b = true;if (a && b) |
如果两个值都为真,则 if 条件为真 换句话说,如果a 和 b都为真,则结果为真。 |
boolean a = true; boolean b = false;if (a || b) |
如果至少有一个值为真,则 if 条件为真 换句话说,如果a 或 b为真,则结果为真。 |
boolean b = false;
|
如果 b 不为真,则 if 条件为真。 换句话说,如果 b 为 false,则结果为 true。 |
int a = 2, b = 3, c = 4;
|
如果 a 小于 b 且 a 小于 c,则表达式的结果为真。 a、b、c都是整数,但是整数比较的结果是一个逻辑值(true,false),这意味着我们可以使用逻辑运算符。 |
“这一切我都知道了。”
“真的吗?那我们继续吧。”
4) “按位运算符”
象征 | 例子 | 姓名 | 描述(它做什么) |
---|---|---|---|
& |
a & b |
和 | 按位与 |
| |
c | d |
或者 | 按位或 |
~ |
~a |
不是 | 按位非 |
^ |
a ^ b |
异或 | 按位“异或” |
“按位运算符对整数执行逐位运算。”
“那是什么?”
“每个数字都表示为一组位,然后计算结果如下:”
“如果两个数的第一位都是 1,那么结果的第一位就是 1。”
“如果两个数的第二位都是1,那么结果的第二位就是1,以此类推。”
“所有按位运算符都是这样吗?”
“比这简单多了,一个位只能有两个值,0和1,对吧?”
“正确的。”
“然后将 1 视为真,将 0 视为假。对各个位的操作将与逻辑操作几乎相同:”
逻辑表达式 | 按位表达式 |
---|---|
真 && 真 == 真 | 1&1 == 1 |
真 && 假 == 假 | 1&0 == 0 |
真|| 真 == 真 | 1|1 == 1 |
真|| 假 == 真 | 1|0 == 1 |
假 || 假 = 假 | 0|0 == 0 |
!假 == 真 | ~0 == 1 |
!true == false | ~1 == 0 |
“哦!那太容易了。”
“是的,只是不要忘记按位运算使用两个数字中的相应位。”
“是的,我记住了:一个数的第一位与第二位的第一位配对,结果也写入第一位。其余位也是如此。”
“对了,你还有什么问题吗?”
“XOR 和‘异或’有什么关系?”
“这是小菜一碟:当值不同时,它是真的;当它们相同时,它是假的。”
逻辑表达式 | 按位表达式 |
---|---|
真 XOR 真 == 假 | 1 ^ 1 == 0 |
假 XOR 假 == 假 | 0 ^ 0 == 0 |
真 XOR 假 == 真 | 1 ^ 0 == 1 |
假 XOR 真 == 真 | 0 ^ 1 == 1 |
以下是按位运算的更多示例:
例子 | 数字作为位 | 结果为位 | 结果 |
---|---|---|---|
5 & 3 |
0000010 1 & 0000001 1 | 0000000 1 | 1个 |
7 & 2 |
000001 1 1 & 000000 1 0 | 00000010 | 2个 |
5 | 9 |
00000 1 0 1 | 0000 1 00 1 | 00001101 | 13 |
5 ^ 9 |
00000 101 ^ 00001001 | 0000 1100 | 12 |
~9 |
~ 00001001 | 11110110 | 246 |
“谢谢你,Bilaabo。现在我知道了。”
“还有一组按位运算符,即移位运算符:”
5) “移位运算符”
象征 | 例子 | 姓名 | 描述(它做什么) |
---|---|---|---|
>> |
a >> b |
右移 | 将数字 a 的位向右移动 b 位。 |
<< |
c << d |
左移 | 将数字 c 的位向左移动 d 位。 |
>>> |
a >>> 2 |
无符号右移 | 将数字 a 的位向右移动 2 位。 |
“这是什么街头魔术?”
“实际上一切都非常简单。检查一下:”
例子 | 数字作为位 | 结果为位 | 结果 |
---|---|---|---|
10 >> 1 |
0000 101 0 >> 1 | 00000 101 | 5个 |
10 >> 2 |
0000 101 0 >> 2 | 000000 10 | 2个 |
10 << 1 |
0000 101 0 << 1 | 000 101 00 | 20 |
10 << 2 |
0000 101 0 << 2 | 00 101 000 | 40 |
“将数字的位向左移动 1 与将数字乘以 2 相同。移动两位相当于乘以 4,乘以三位 - 乘以 8,依此类推。”
“右移对应除以 2、4、8、16 等。”
“但是 >>> 和 >> 运算符之间有什么区别?”
“他们在处理负数时有所不同。这是因为 带符号的数字使用最左边的位来表示符号。结果,负数向右移动时不再是负数。因此,他们想出了两个不同的运算符。一探究竟:”
表达 | 结果 | 描述 |
---|---|---|
1 000 1010 >> 1 | 11 000 101 | 负数保持负数。 对于负数,传入的位用 1 填充。 |
1 000 1010 >> 2 | 111 000 10 | |
1 000 1010 >> 3 | 1111 000 1 | |
1 000 1010 >>> 1 | 01 000 101 | 负数不再是负数。对于负数,传入的位用 0 填充。 |
1 000 1010 >>> 2 | 001 000 10 | |
1 000 1010 >>> 3 | 0001 000 1 |
“移位不是循环的。超出数字左边缘或右边缘的位将被简单地丢弃。”
6) “赋值运算符”
“我已经知道赋值是什么了。但为什么要说‘操作员’呢?”
“因为他们有好几个☺”
操作员 | 这是什么意思 |
---|---|
a += b; |
a = a + b; |
a -= b; |
a = a - b; |
a *= b; |
a = a * b; |
a %= b; |
a = a % b; |
a |= b; |
a = a | b; |
a &= b; |
a = a & b; |
“我想你明白逻辑了。”
7)《自增自减运算符》
符号 | 例子 | 描述 |
---|---|---|
++ |
a++; ++b; |
将数字增加 1。 |
-- |
d--; --i; |
将数字或变量减 1。 |
“将两个减号放在变量之前或之后有区别吗?”
“是的,虽然不是很大。如果具有这些运算符之一的变量是表达式或赋值的一部分,那么就会存在差异。我宁愿通过示例向您展示:”
例子 | 真正发生了什么 | 描述 |
---|---|---|
int a = 3; int b = ++a; |
int a = 3; a = a + 1; int b = a; |
a先加1,然后用在表达式中。 |
int a = 3; int b = a++; |
int a = 3; int b = a; a = a + 1; |
a先用在表达式中,然后加1。 |
int a = 3; return a++; |
int a = 3; int result = a; a = a + 1; return result; |
该函数将返回 3,但 a 的值将增加 1。 |
int x = 5; x = ++x + ++x; |
int x = 5; int a = x + 1;// The first term is 6 x = a; int b = x + 1;// The second term is 7 x = b; x = a + b; |
这里的结果是 13。首先,x 会增加 1,这个值会替换第一项,然后 x 会再次增加 1。 |
“哇!太酷了!”
“我很高兴你喜欢它。但是,如果没有表达或任务,那么就没有区别:”
“x++ 等同于 x = x + 1。”
“++x 等同于 x = x + 1。”
“我会记住的。谢谢,Bilaabo。”
8) “三元运算符”
“这个运算符不只是使用一个或两个变量或表达式。它同时使用三个变量或表达式:”
符号 | 等效代码: |
---|---|
a ? b : c; |
if (a) b else c |
int min = a < b ? a : b; |
if (a < b) min = a; else min = b; |
return a != null ? a.length : 0; |
if (a != null) return a.length; else return 0; |
“嗯,超级方便。”
“是的。而且它很紧凑,代码可读。喜欢使用它!”
9) “其他”
“无论您的音乐收藏整理得多么好,您仍然必须创建一个“杂项”文件夹。”
“是的,任何曾经对音乐进行分类的人都会完全同意。”
“那么,我还要给大家介绍三个干员:”
符号 | 例子 | 描述 |
---|---|---|
() |
(a + b) * c |
括号增加运算符的优先级。 括号里的东西先执行。 |
[] |
c [i] = c [i + 1]; |
通过索引获取数组元素。 |
. |
int n = a.length; |
“点运算符”访问对象的变量和方法。 |
“最后,这是一张总结运算符优先级的表格:”
运营商 | 例子 |
---|---|
最高优先级(运算符根据其在此表中的顺序执行) | |
() [] . |
(a + b) c [i] = c [i] + 1 |
++ -- ~ ! + - |
i++; ++i; --j; a--; ~c !f return +a; return -a; |
* / % |
a * b c / d a % b |
+ - |
a + b c - d String s = "count"+"35"; |
>> << >>> |
a >> 3 b << 2 c >>> 3 |
< <= > >= |
a < b a <= b c > b c >= b |
== != |
a == 3 a != 0 |
& |
a & 7 |
^ |
a ^ b |
| |
a | b |
&& |
(a < b) && (a < c) |
|| |
(b != 0) || (c != 0) |
? : = |
a > 0 ? a : -a; |
= *=, /=, %= -=, += <<=. >>=, >>>= &=, ^=. |= |
|
最低优先级(最后执行) |
GO TO FULL VERSION