编辑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's follow-up question中所讨论的那样,人们提到的规则(在较短的令牌++之前首先解析较大的令牌++)在this presentation中讨论,它似乎被称为Munchy Munchy规则。
答案 0 :(得分:13)
没有+++
运算符。你有一个后缀++
运算符后跟一个中缀+
运算符。这是一个编译错误,因为postfix ++
只能应用于变量,"s "
不是变量。
由于您的确意味着中缀+
运算符后跟前缀++
运算符,因此您需要将空格放在运算符之间。
实际上,你应该这样做。 +++
是可读性犯罪!!!
答案 1 :(得分:5)
编译器在解析源代码时生成最长的令牌,因此当遇到 +++ 时,它会将其作为 ++ + 。
所以
的代码a +++ b
将始终与
相同(a++) + b
答案 2 :(得分:2)
三重加号不是运营商本身,而是两个运营商合并:
三重加上实际上做的是:
a +++ 1 == a ++ + 1;
你要做的是++一个字符串,它是未定义的。
永远不要在代码中使用带有空格的+++;几乎没有人会知道它的作用(没有咨询网站)。而且,在一周左右之后,你将无法知道它实际上是做什么的。
答案 3 :(得分:1)
+++
本身不是运营商。
i = i +++i;
会产生预增量值i
,然后将其添加到i
的值并将其存储在i
中
使用String,+
并不意味着添加,因此您尝试将字符串和整数连接在一起。