不同的间距如何影响一元算子?

2022-09-01 15:21:39

谁能解释一下不同的间距如何影响一元算子?

int i = 1;
int j = i+ + +i; // this will print j=2
int k = i++ +i; // this will print k=3
int l = i+++i; // this will print l=3
int m = i++++i; // compile time error

.


答案 1

首先,让我们将其分为三个无法交互的独立情况:

int i = 1;
System.out.println(i+ + +i); // 2

int j = 1;
System.out.println(j++ +j); // 3

int k = 1;
System.out.println(k+++k); // 3

现在让我们使用括号重写它们:

int i = 1;
System.out.println(i + (+(+i)));

int j = 1;
System.out.println((j++) + j);

int k = 1;
System.out.println((k++) + k);

首次操作

在这里我们不能使用前缀或后缀++运算符,因为我们没有任何地方的令牌。相反,我们有一个二元 + 运算符和两个一元 + 运算符。++

第二次操作

这个很简单:它几乎是读起来的,一个后缀++运算符,后跟一个二进制+运算符(而不是可能暗示的一元+运算符)。+j

第三次操作

最后一行被解析为 而不是 。在这种情况下,两者实际上都会给出相同的答案,但是我们可以通过使用两个不同的变量来证明哪个是哪个:(k++) + kk + (++k)

int k1 = 1;
int k2 = 1;
System.out.println(k1+++k2); // Prints 2
System.out.println(k1); // Prints 2
System.out.println(k2); // Prints 1

如您所见,它是递增的,而不是.k1k2

被解析为 、 、 的标记的原因是由于 JLS 的第 3.2 节,其中包括:k+++kk+++k

在每一步都使用尽可能长的翻译,即使结果最终没有做出正确的程序,而另一个词法翻译会。

第四次操作(编译失败)

相同的“最长可能的转换”规则解析为 , ,,这不是有效的表达式(因为操作的结果是值,而不是变量)。i++++ii++++i++


答案 2

+是一个运算符,并且是一个运算符,但不是 - 被解释为两个 s,而不是一个 。因此,空间会强制以不同的方式解释您的代码。+++ ++ ++++

+既是将两个数字相加的二元运算符,也是不改变数字的一元运算符(它的存在只是为了与一元运算符保持一致)。-

如果我们用二进制代替,而不是一元,而不是那样,它可能会更清楚。add+no-change+increment++

int j=i+ + +i成为。
成为。
我怀疑也成为,但我没有用语言规范检查这一点。int j = i add no-change no-change i;int k=i++ +i;int k=i increment add i;int k = i+++i;int k = i increment add i;


推荐