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 "不是变量.
因为你的意思是中缀+运算符后跟前缀++运算符,所以你需要在运算符之间放置空格.
实际上,你应该这样做. +++是一种可读性犯罪!
编译器在解析源时会生成最长的令牌,因此当遇到+++时,它会将其作为++ +.
所以代码
a +++ b
Run Code Online (Sandbox Code Playgroud)
永远都是一样的
(a++) + b
Run Code Online (Sandbox Code Playgroud)