Java - 编译器的贪心规则

三个加号连加,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"。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值