逻辑与&&和或||的执行顺序

    科技2022-08-12  204

    今天刷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容器的越界有不同的效果。

    Processed: 0.024, SQL: 8