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

chm*_*chm 7 java integer string-concatenation operators addition

编辑1

免责声明:我知道这 +++ 是不是一个真正的运营商,但+与++运营商没有空格.我也知道没有理由使用它; 这个问题只是出于好奇.


所以,我很想知道Java 之间是否需要+和之间的空间++var.

这是我的测试代码:

int i = 0;
System.out.println(i);
i = i +++i;
System.out.println(i);  
Run Code Online (Sandbox Code Playgroud)

打印出:

0
1
Run Code Online (Sandbox Code Playgroud)

这可以像我期望的那样工作,就像在第一个和第二个之间有一个空间一样+.

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

String s1 = "s " + ++i;
System.out.println(s1);
// String s2 = "s " +++i;
Run Code Online (Sandbox Code Playgroud)

打印出:

s 2
Run Code Online (Sandbox Code Playgroud)

但是如果第三行是未注释的,则代码不会编译,错误如下:

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;
                     ^
Run Code Online (Sandbox Code Playgroud)

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


编辑2

正如在Abhijit的后续问题中所讨论的那样,人们提到的规则(在较短的令牌++之前首先解析较大的令牌++)在本演示中被讨论,它似乎被称为Munchy Munchy规则.

Ste*_*n C 13

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

因为你的意思是中缀+运算符后跟前缀++运算符,所以你需要在运算符之间放置空格.

实际上,你应该这样做. +++是一种可读性犯罪!


Val*_*ouk 5

编译器在解析源时会生成最长的令牌,因此当遇到+++时,它会将其作为++ +.

所以代码

a +++ b
Run Code Online (Sandbox Code Playgroud)

永远都是一样的

(a++) + b
Run Code Online (Sandbox Code Playgroud)