三个加号连加,i+++j,是按照i+(++j)运算还是(i++)+j运算呢?这个问题在类似于C/C++中讨论时没有多大意义的,因为C/C++依赖于实现的硬件结构,不同的环境结果也会不同。不过在Java中,这个结果是固定的,不受硬件环境和平台影响。这个问题的结果是后者。
这种结合性归根于编译器的贪心规则,也就是说,在分析符号的时候,编译器会尽可能多地结合有效的符号,例如上面的表达式:“+” 和“++”都是有效地符号,但是“+++”不是有效的符号,因此,经过分析后,最终将表达式解析为:++ +。
这种贪心规则不会考虑结合后语法的规则。比如:a-- b,我们原意是a 减去–b,但是由于”--”是有效的符号,所以编译器会解析为 a-- b,这样就不符合语法规则了,所以产生了编译错误。
这种贪心规则在对转义字符等进行处理时候是很有用的。
public static void main(String args[]) {
String s;
s = "\43";
System.out.println(s + " 长度: " + s.length());
s = "\431";
System.out.println(s + " 长度: " + s.length());
}
最后输出为:
# 长度: 1
#1 长度: 2
因为贪心规则,编译器会尽可能多地对有效字符进行结合。八进制转义字符的取值范围\0 - \377,所以\43转义的时候就是(\43),而\431就对应(\43)1。
所以,如果要转义4 和 3对应的字符,那么就应该写:"\4\3"。