7

编辑 1

免责声明:我知道这 +++ 不是真正的运算符,而是没有空格的+and运算符。++我也知道没有理由使用它;这个问题只是出于好奇。


所以,我很想看看Java中是否需要+和之间的空间。++var

这是我的测试代码:

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

这打印出来:

0
1

正如我所期望的那样工作,就像 first 和 second 之间有一个空格一样+

然后,我尝试了字符串连接:

String s1 = "s " + ++i;
System.out.println(s1);
// String s2 = "s " +++i;

这打印出来:

s 2

但是如果第三行没有注释,代码就无法编译,报错:

Problem3.java:13: unexpected type
required: variable
found   : value
    String s2 = "s " +++i;
                ^
Problem3.java:13: operator + cannot be applied to <any>,int
    String s2 = "s " +++i;
                     ^

是什么导致字符串连接和整数加法之间的行为差​​异?


编辑 2

正如Abhijit 的后续问题中所讨论的,人们提到的规则(首先解析较大的标记 ++,在较短的标记 ++ 之前)在本演示文稿中进行了讨论,它似乎被称为 Munchy Munchy 规则。

4

4 回答 4

13

没有+++操作员。你有一个后缀++运算符,后跟一个中缀+运算符。这是一个编译错误,因为 postfix++只能应用于变量,而"s "不是变量。

由于您的真正意思是中缀+运算符后跟前缀++运算符,因此您需要在运算符之间放置空格。

实际上,无论如何你都应该这样做。 +++是对可读性的犯罪!!!

于 2013-03-13T06:27:48.770 回答
5

编译器在解析源代码时会生成尽可能长的标记,因此当遇到+++时,它会将其视为++ +

所以代码

a +++ b

将永远相同

(a++) + b
于 2013-03-13T10:06:14.853 回答
2

三倍加号本身不是运算符,它是两个运算符的组合:

三倍加的实际作用是:

a+++1 == a++ + 1;

您要做的是 ++ 一个未定义的字符串。

永远不要在代码中使用没有空格的 +++;几乎没有人会知道它的作用(没有咨询网络)。此外,大约一周后,您将不知道它自己实际做了什么。

于 2013-03-13T06:27:45.037 回答
1

+++本身不是运算符。

i = i +++i;产生 的预增量i,然后将其添加到 的值中i并将其存储在 中i

使用字符串,+并不意味着加法,因此您尝试将字符串和整数连接在一起。

于 2013-03-13T06:28:08.947 回答