今天刷LeetCode的每日一题,四数之和(18题)。
因为没思路,就先看了一遍官方答案的思路,然后默写了一下。但执行时候就崩溃了。
仔细一个个语句对照之后,发现了问题在数组访问越界。
数组越界,简而言之,就是:假设一个一维数组有三个元素,我却访问了第四个元素,程序就会就崩溃。
在这道题的程序中,体现为以下程序不会崩溃,
while(left < right && nums[left] == nums[left+1] )//一个典型的双指针算法
left++;
但下面程序就可以越界崩溃。
while(nums[left] == nums[left+1] && left < right )//一个典型的双指针算法
left++;
只是交换了与操作两边的顺序,为何前者不崩溃而后者崩溃呢?
因为,逻辑运算在编译过程中确实存在优化。目前发现的规则如下:
对于a&&b,如果a==0,将不再计算b的值。即使b的取值会越界,程序也依然可以继续运行。
同理,对于a||b,如果a==1,将不再计算b的值,因为已经保证了结果是1。
具体的可以参考这篇博客:https://blog.csdn.net/u014490083/article/details/78718330
虽然利用以上的规律可以规避一些崩溃,但我觉得最好还是严格处理比较好,即用两个if分别判断两个布尔变量。
对于数组越界的问题,我想通过另一篇博客来专门讨论一下,因为我发现C风格数组和C++的vector容器的越界有不同的效果。