如果您移除+和++运算符之间的空格会发生什么?

7

EDIT 1

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


因此,我想知道在Java中+++var之间是否需要空格。

这是我的测试代码:

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

这将打印出以下内容:
0
1

这段代码的效果和我预期的一样,就好像在第一个和第二个+之间有一个空格一样。

接下来,我尝试使用字符串拼接:

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”规则。


1
类似于 i = i+++++i; 这样的语句是无效的,但是 i = i++ + ++i; 是有效的。 - Jayamohan
由于它不是运算符,询问它的工作原理是没有意义的。这不是一个真正的问题。 - user207421
@EJP但是我有免责声明和一切!已编辑标题以使真正的问题更明显;我只是想知道当它们之间没有空格时如何解析+和++。 - chm
4个回答

13

没有 +++ 操作符。你那里有一个后缀的 ++ 操作符,后面跟着一个中缀的 + 操作符。 这是一个编译错误,因为后缀的 ++ 只能应用于变量,而"s "不是变量。

由于您实际上是想使用中缀的 + 操作符后跟前缀的 ++ 操作符,所以需要在操作符之间加上空格。

实际上,无论如何,您都应该这样做。 +++ 是可读性差的写法!


5
编译器在解析源代码时会生成最长的可能标记,因此当它遇到+++时,会将其视为++ +
因此,以下代码:
```java int a = 1; a+++; ```
会被编译器解析为:
```java int a = 1; a++ +; ```
a +++ b

将始终与下面的内容相同

(a++) + b

2

三个连续加号并不是一个运算符本身,而是两个运算符的组合:

三个连续加号实际上做的是:

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

你试图执行++一个字符串,这是未定义的。

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


1

+++并不是一个独立的运算符。

i = i +++i; 的结果是对 i 进行 预增量,然后将其加到 i 的值上,并将结果存储在 i 中。

对于字符串来说,+ 并不表示加法,因此您尝试将字符串和整数连接在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接