我学习 c++,我有一个这样的练习:
查找此代码中的逻辑缺陷或低效率。
我发现两个 for 语句效率低下。但我觉得存在更多的问题点。帮我找出他们在哪里。
int Sum(int start, int last) {
int* a = new int[last - start];
int sum = 0;
for (int i = start; i <= last; ++i) {
a[i] = i;
}
for (int i = start; i <= last; ++i) {
sum += a[i];
}
return sum;
}
此代码有多个编码问题:
- 它
- 分配一个新数组,但从不释放它(内存泄漏(
- 它没有为数组分配足够的内存(
last - start
应该last - start + 1
( - 它将数组从
start
到last
(包括 (进行索引,而它应该将其从 0 索引到last - start
(包括 - 当
last
小于start
时,new []
的调用具有未定义的行为(无前提条件检查(。
但是,最大的问题是逻辑问题:代码计算 start
和 last
之间的连续数字之和,包括,这可以通过算术级数总和的公式以封闭形式完成,该公式根本不使用数组:
int Sum(int start, int last) {
return (last - start + 1)*(last + start) / 2;
}