各位,我知道这个问题有可能是十分好笑的,毕竟它过于基础,但是在我实操的过程中却发现了一些有意思的不同。
首先,我们知道++n是先对n进行+1操作,然后再进行运算;而n++则是先拿旧值进行元素,再对n进行+1操作,那么在下面的代码中n++ + n++ 难道不应该是3 + 3 才对吗?为何最终是3 + 4 ?第二个n++难道不是返回其原来的值3吗?
int n = 3;
System.out.println(n++ + n++);
各位,我知道这个问题有可能是十分好笑的,毕竟它过于基础,但是在我实操的过程中却发现了一些有意思的不同。
首先,我们知道++n是先对n进行+1操作,然后再进行运算;而n++则是先拿旧值进行元素,再对n进行+1操作,那么在下面的代码中n++ + n++ 难道不应该是3 + 3 才对吗?为何最终是3 + 4 ?第二个n++难道不是返回其原来的值3吗?
int n = 3;
System.out.println(n++ + n++);
左侧比右侧先求值,在计算右侧的的 n++
的时候,左侧 n++
的计算已经全部结束,包括降新的 n
保存回去。所以在计算右侧的 n++
时,n
已经是 4
了。
15.7.1. Evaluate Left-Hand Operand First
The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.
If the operator is a compound-assignment operator (§15.26.2), then evaluation of the left-hand operand includes both remembering the variable that the left-hand operand denotes and fetching and saving that variable's value for use in the implied binary operation.
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
曾经刷过几十道关于n++, 与++N 的各种排列组合的学生以及工作几年的老油条, 认为考试与面试出这种问题几乎毫无意义!!!! 学到了完全置之不理是最好的态度
前提条件: 这个代码是从左向右的
n++ 实际上是 n = n+1, 会改变n的值
在题主的描述中, 就是最后一句话理解错了,
n++ + n++
--->(n++) + n++
, 确实第一个个n++ 是用3计算的,n++ + n++
--->3++ + n++
, 然后此时在进行中间的加法时, n是进行了加一后的:n++则是先拿旧值进行元素,再对n进行+1操作
, 因此在进行中间加法时, 需要取n++
, 但此时的n
, 是前半部分n++
后的n
, 就是 4 , n 的值已经该变了, n 为 4 , 在进行第二个n++
时, 先取 n ,就是 4 然后计算因此是 3 + 4int total = n++ + n++
, 这个语句执行完毕后, n 为 5, 加了两次 N+ 1嘛不用纠结n++, ++n, 没有啥意义, 还浪费时间, 考试出这种题目也很没有水平(都是泪), 直接跳过就好了, 知道 是 n = n+1, 就好了