1.布尔运算
|and运算符&不仅可以应用于数字,还可以应用于布尔表达式。
但是,如您所知,有&&and||运算符。为什么我们要使用|instead of||和&instead of &&?这有什么意义吗?好像有。有时。
和逻辑运算符遵循所谓的惰性原则从左到右执行||。&&
(expression1) || (expression2) || (expression3)
如果expression1 等于,则评估 andtrue没有意义:不管结果如何。expression2expression3true
因此,在评估表达式时(它们是从左到右评估的),一旦我们得到true,就会跳过对其余表达式的评估。如果expression2 包含expression3方法调用,则不会调用这些方法!
逻辑运算符也是如此&&:
(expression1) && (expression2) && (expression3)
如果expression1等于,则评估andfalse没有意义:不管结果如何。expression2expression3false
这是一个重要的事实,可以让您编写如下内容:
String s = null;
if (s != null && s.length() > 0) {
上面的例子永远不会给你一个NullPointerException,因为s.length()只有当第一部分s! = null是true.
如果s等于null,运算符左边的部分&&是false,那么整个布尔表达式的结果是false,所以右边的 ( s.length() > 0) 部分不被计算。
如果你使用|operator 或&operator,那么就没有惰性求值:每个子表达式都会被求值。
2. Java中的操作优先级
您可能还记得在高中数学课上,乘法运算符的优先级高于加法运算符。括号的优先级更高:首先计算括号中的表达式,然后是乘法和除法,然后是加法和减法。
Java 中的运算符也有优先顺序。不同之处在于 a) 它们的数量稍微多一些,b) 对于某些运算符,操作数是从左到右计算的,而对于其他操作符 - 从右到左计算。
这是一张包含所有 Java 运算符的表格:
| 类别 | 操作员 | 关联的 |
|---|---|---|
| 后缀 | () [] . |
从左到右 |
| 一元 | ++ -- ! ~ |
右到左 |
| 乘法 | * / % |
从左到右 |
| 添加剂 | + - |
从左到右 |
| 转移 | >> >>> << |
从左到右 |
| 关系型 | > >= < <= |
从左到右 |
| 平等 | == != |
从左到右 |
按位AND |
& |
从左到右 |
Exclusive OR(异或) |
^ |
从左到右 |
按位OR |
| |
从左到右 |
合乎逻辑AND |
&& |
从左到右 |
合乎逻辑OR |
|| |
从左到右 |
| 有条件的 | ?: |
右到左 |
| 任务 | = += -= *= /= %= >>= <<= &= ^= |= |
右到左 |
| 逗号 | , |
从左到右 |
顶行包含具有最高优先级的运算符。括号()用于明确设置优先级。方括号[]用于访问数组变量特定索引处的元素。点运算符 ( .) 用于使用对对象或类的引用来访问字段和方法。
运算符在表中越靠下,它们的优先级就越低。
如果您在一个表达式中使用多个运算符,请不要偷懒:添加括号。
在 Java 中,您可以编写类似于 的内容if (a & 1<< b > ~c),但您不应该这样做。您不仅要为编译器编写代码,还要为其他程序员编写代码。代码的可读性越高越好。
3.前缀和后缀递增
如您所知,Java 有一个递增运算符 ( ++) 和一个递减运算符 ( --)。它们分别将变量的值增加和减少1.
您可能不知道的是,这些运算符有两种类型:前缀(运算符位于变量之前)和后缀(运算符位于变量之后)。两种运算符的工作方式略有不同。
在 Java 中,您可以编写如下表达式:
int a = 5;
int b = a++;
如果++运算符出现在变量之后并且变量是某个表达式的一部分(如上例所示),则表达式将使用变量的当前值,并且只有在之后变量才会增加1.
换句话说,会发生这样的事情:
int a = 5;
int b = a;
a = a + 1;
也就是说,bwill be 5,并不6像你乍一看所想的那样。
如果++运算符在变量之前并且变量是某个表达式的一部分,它会首先增加1,然后它的值才会在表达式中使用。
int a = 5;
int b = ++a;
上面的例子等同于下面的例子:
int a = 5;
a = a + 1;
int b = a;
在这里,b将等于6。
甚至有一个 Java 程序员用来判断其他人是否也是 Java 程序员的例子:
int a = 5;
int b = ++a + ++a;
是的,你也可以这样写。
这个例子将编译得很好并变成这样的东西:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
对于--运营商来说,一切都如出一辙。
GO TO FULL VERSION