Kotaira 发表于 2020-5-26 13:15

求Java大佬们帮我看看这个问题xx

本帖最后由 Kotaira 于 2020-5-26 14:02 编辑


就是我注释掉的那行和它下面那行...注释掉的是正确的,下面那行只是调整了一下顺序,为什么就错了呢?
是我对Java理解不到位还是编译器的问题...

补一张局部大图:



=============
谢谢好兄弟们了, 我现在反应过来了,顺序还真不能变,要不然就是先越界,后判断是否越界.

asatmda 发表于 2020-5-26 13:39

这个是你算法的问题,和java本身没有关系。搞acm就是这样,你想的和出题人想的不一定一下子就合上了。

jhchengzijiang 发表于 2020-5-26 13:42

lytalyt 发表于 2020-5-26 13:43

left < nums.length这个判断是为了保证不越界,你注释掉的那行里,当left == nums.length的时候,整个表达式的值肯定是false,所以&&后面的条件就不会执行了,这属于jvm的优化。但是你如果把left < nums.length的判断放在后面,那么jvm就会先判断nums == nums的结果,自然就越界了。PS:这是leetcode里三数之和的那个题吧

ben_29 发表于 2020-5-26 13:48

判断越界在前面,后面的条件就没执行了,调换了顺序之后先越界了

知心 发表于 2020-5-26 13:52

&& 成双成对出现的是短路运算符。一旦前半截运算的结果可以确认整个运算式的结果就不继续计算了。同真为真,有假为假

Kotaira 发表于 2020-5-26 14:03

lytalyt 发表于 2020-5-26 13:43
left < nums.length这个判断是为了保证不越界,你注释掉的那行里,当left == nums.length的时候,整个表达 ...

哈哈哈, 确实, 刷b站看到有up用这个 ,心血来潮了

Kotaira 发表于 2020-5-26 14:06

知心 发表于 2020-5-26 13:52
&& 成双成对出现的是短路运算符。一旦前半截运算的结果可以确认整个运算式的结果就不继续计算了。同真为真 ...

现在明白了好兄弟, 当时短路与,逻辑与都试过,愣是没看出来我写的这个先越界,后判断是否越界.好蠢啊{:1_937:}

Kotaira 发表于 2020-5-26 14:07

jhchengzijiang 发表于 2020-5-26 13:42
这不是&&,如果前面的错了,后面自动忽略不判断
像判断对象属性是否为空,你得先判断对象是否为空 && 属性 ...

谢谢好兄弟了 ,现在懂了

Kotaira 发表于 2020-5-26 14:09

ben_29 发表于 2020-5-26 13:48
判断越界在前面,后面的条件就没执行了,调换了顺序之后先越界了

谢谢好兄弟, 明白了
页: [1]
查看完整版本: 求Java大佬们帮我看看这个问题xx