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! = nulltrue.

如果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;

对于--运营商来说,一切都如出一辙。