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

时间:2013-03-13 06:23:21

标签: java integer operators string-concatenation addition

编辑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规则。

4 个答案:

答案 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,+并不意味着添加,因此您尝试将字符串和整数连接在一起。

相关问题