运算符优先级 - 1

“嗨,比拉博!”

“比拉博很高兴迎接他的朋友!”

“今天 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;

if (!b)

如果 b 不为真,则 if 条件为真。
换句话说,如果  b 为 false,则结果为 true
int a = 2, b = 3, c = 4;

if (a < b && a < c)
if ((a < b) && (a < c))

如果 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;
=
*=, /=, %=
-=, +=
<<=. >>=, >>>=
&=, ^=. |=
最低优先级(最后执行)