为何Java代码输出结果为30而非31?自增运算符优先级疑问
为什么这段Java代码输出30而不是预期的31?
嘿,这个问题的根源在于Java编译器的最长匹配规则(也叫“贪婪解析”),咱们一步步拆解来看:
问题代码解析
先看你这段代码里的关键行:
System.out.println(myFirstNumber+++mySecondNumber);
你可能以为+++会被解析成+ ++(也就是把mySecondNumber做前自增),但Java编译器会尽可能把连续字符组合成最长的合法语法单元(token)。所以这里的+++会被拆成:
++:属于myFirstNumber的后自增运算符(myFirstNumber++)+:加法运算符
这行代码实际等价于:
System.out.println( (myFirstNumber++) + mySecondNumber );
计算过程
myFirstNumber++是后自增:先返回当前值20,之后才把myFirstNumber的值改成21- 加上
mySecondNumber的初始值10,总和就是20 + 10 = 30 - 这就是为什么输出是30,而不是你预期的31
如何得到预期的31?
如果想让mySecondNumber做前自增,需要明确拆分运算符,比如加括号或者调整写法(可读性更高):
// 写法1:用括号明确优先级 System.out.println( myFirstNumber + (++mySecondNumber) ); // 写法2:拆分代码,更清晰 int sum = myFirstNumber + ++mySecondNumber; System.out.println(sum);
这样++mySecondNumber会先把mySecondNumber的值改成11,再返回11,加上myFirstNumber的20,总和就是31了。
内容的提问来源于stack exchange,提问作者Chronic Procrastinator
相关产品推荐
相关产品推荐

