为何SumRange触发IndexOutOfRangeException,SumRanges却正常运行?
前缀和函数索引越界问题分析
给定数组:
var nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
需实现计算区间[a,b]内元素和的前缀和函数,但两个实现中,SumRange触发System.IndexOutOfRangeException,SumRanges却能正常运行,原因如下:
报错的SumRange函数
int SumRange(int left, int right) { return pre[right] - left >= 1 ? pre[left - 1] : 0; }
正常运行的SumRanges函数
int SumRanges(int left, int right) { int l = left >= 1 ? pre[left - 1] : 0; return pre[right] - l; }
问题根源:运算符优先级错误
C#中运算符优先级从高到低排序:减法- > 关系运算符>= > 三元运算符?:。
在SumRange里,表达式pre[right] - left >= 1 ? pre[left - 1] : 0的执行顺序是:
- 先计算
pre[right] - left - 将计算结果与1比较
- 根据比较结果,若成立则返回
pre[left-1],否则返回0
这意味着,当left=0时,只要pre[right]-0 >=1成立,就会执行pre[-1],直接触发索引越界异常——完全没按你预想的用left >=1来判断是否访问pre[left-1]。
而SumRanges的逻辑是先判断left >=1:
- 只有
left>=1时才会访问pre[left-1] left<1时直接取0,从根源避免了访问非法索引pre[-1]的情况。
内容的提问来源于stack exchange,提问作者Priyadarshi Sadiku
相关产品推荐
相关产品推荐

