为什么int i1 = - + 0007与int i2 = + -0007相同?为什么两个正负编译都很好?

时间:2017-10-28 07:03:20

标签: java

这些意外行为有哪些规则?

int i1 = -+0007;
int i2 = +-0007;
System.out.println(i1);  // output: -7
System.out.println(i2);  // output: -7

    int i3 = +-+0007;   // -7
    int i4 = -+-0007;   // 7

我知道一元符号运算符是右关联运算符。但如果减去第一个(最右边),则下一个加号(向左)似乎不会将符号从减号更改为加号(即什么都不做!)。但第二个减去变化符号(从负到正)。

此外,我们不能在+ - + - + - 的这个序列中的任何地方使用++或 - (+ - +是编译错误:最右边+(或最左边+)是 - 操作的错误操作数。)

2 个答案:

答案 0 :(得分:1)

一元-更改了标志。一元+没有,它几乎没有意义,只有unary numeric promotion,你可以看到here了解更多细节。

所以在你的第一行:

int i1 = -+0007;

+不会对-

进行-7次更改

第二行:

int i2 = +-0007;

--7 +的更改不执行任何操作

+--+是编译错误,因为--是一个只能对变量进行操作的不同运算符。以下内容将起作用:

int b = 1;
int a = -++b; // increment b by 1, change the sign and assign to a
System.out.println(a); // prints -2

您可以使用括号或添加空格来+--+编译

int i = +-(-+7); // will be equal to 7 because only the 2 `-` change the sign
int i = +- -+7;

答案 1 :(得分:-1)

它已经与数学有关。如果乘以负数和正数,结果为负数。如果将两个负数相乘,则结果为正。

因此,-+也可以写为:

-…: (-1) * …
+…:  (1) * …