逻辑运算短路现象记录
在刷力扣15. 三数之和这道题时遇到了逻辑运算的短路现象,这个名词我只在本科大一上的C语言课上听老师说过,今天在写这道题的时候碰到了,一开始我还以为是二维vector的初始化问题,下面详细道来:
在这道题中,首先要做的是去重,很容易想到的一种去重方法是,将原数组进行排列后,如果数组的第一个元素还是大于0的,则这个数组不会有这样的一个三元组,它们的和为0。
第二种去重是要注意这种情况[a, a, ...], 如果本轮a和上轮a相同,那么找到的b,c也是相同的,所以去重a。
我一开始是这么写的判断条件:
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
然后力扣一直报错数组越界,是因为:
-
首先判断
nums[i] == nums[i - 1]
。 -
在判断
nums[i] == nums[i - 1]
之前,没有对i
的值进行任何检查。 -
如果
i
为0
,则nums[i - 1]
就变成了nums[-1]
,这是一个非法的数组访问,会导致数组越界错误(例如在 C/C++ 中可能触发运行时错误,如段错误)。
这里就涉及到了逻辑运算中的短路现象:当 nums[i] == nums[i - 1]
的判断失败(例如数组越界导致程序崩溃)时,后面的 i > 0
根本不会被执行。
短路现象是指:
-
对于
A && B
,如果A
为false
,则不会计算B
。 -
对于
A || B
,如果A
为true
,则不会计算B
。