下述Java代码中哪些行会报错?第2、4行报错原因解析
Java代码中第2、4行编译报错的原因解析
先看完整代码:
public static void main (String[] args) { int a=10,b=20; System.out.println(a+++--b);//line 1 System.out.println(a--+++b);//line 2 System.out.println(a++-++b);//line 3 System.out.println(a+++++b);//line 4 }
Java的词法分析器遵循最长匹配原则——从左到右扫描代码时,会尽可能组合出最长的合法语法单元(token)。这是导致第2、4行报错的核心原因,下面逐行解析:
Line 1:a+++--b
被解析为 (a++) + (--b),完全合法:
a++是后置自增,先返回当前值再让a自增--b是前置自减,先让b自减再返回新值
两者做加法运算,编译运行都正常。
Line 2:a--+++b
按照最长匹配规则,会被拆解为 (a--) ++ + b:
a--是后置自减,返回的是a自减前的数值结果(不是变量本身)- 而
++自增操作符要求操作数必须是可修改的变量(左值),不能作用于数值字面量或表达式的结果
这就导致(a--)++违反语法规则,编译器直接报错。
Line 3:a++-++b
被解析为 (a++) - (++b),合法:
a++返回当前值后自增,++b自增后返回新值
两者做减法运算,语法上完全合规。
Line 4:a+++++b
同样遵循最长匹配规则,被拆解为 (a++) ++ + b:
a++返回的是数值结果,无法作为++操作的目标(因为++需要操作变量)
因此和Line2一样,触发编译报错。
内容的提问来源于stack exchange,提问作者Jayveer Mall
相关产品推荐
相关产品推荐

