为什么当我在代码末尾添加内容时,我为“k”变量获得不同的值。 k的值是4,但是如果我在注释中添加那么一小部分就会变为5.我想这不会影响任何事情。我错了吗?或者我该怎么做才能解决这个令人讨厌的问题呢?
我的代码(代码:块)
#include <iostream>
using namespace std;
int main()
{
int N = 10;
int A[]={1100, 700, 950, 780, 850, 1050, 750, 950, 950, 700};
int k = 0;
if (A[0] > 800) {
k = 1;
} else {
k = 0;
}
for (int i = 1; i < N; i++) {
if (A[i]<= 800 && A[i+1] > 800) {
k++;
}
}
cout << k << endl;
/* int max_size = k;
int h[max_size]; */
}
答案 0 :(得分:5)
在计算机编程中,未定义的行为(UB)是执行用编程语言编写的计算机代码的结果,语言规范没有规定如何处理该代码。未定义的行为是不可预测的,并且是软件错误的常见原因。
考虑这段代码:
for (int i = 1; i < N; i++) {
if (A[i]<= 800 && A[i+1] > 800) {
k++;
}
}
当i
等于N - 1
时,循环内的条件变为:
if (A[N-1]<= 800 && A[N] > 800)
结果导致undefined behaviour。
你可以通过在第一种情况下改变你想要的限制来解决这个问题:
for (int i = 1; i < N - 1; i++)
或通过将循环内的条件更改为:
if (A[i - 1]<= 800 && A[i] > 800)
答案 1 :(得分:2)
if (A[i]<= 800 && A[i+1] > 800)
A[i+1]
时, i=N-1
超出了范围
答案 2 :(得分:1)
如@ivan提供的答案所述,问题在于索引编制不正确。所以,正确的方法是......
for (int i = 1; i < N; i++) {
if (A[i-1]<= 800 && A[i] > 800) {
k++;
}
}
答案 3 :(得分:1)
您没有说明代码应该完成什么,但最合理的猜测意味着您应该通过更改来修复未定义的行为和单独的错误行为:
if (A[i]<= 800 && A[i+1] > 800) {
到
if (A[i-1]<= 800 && A[i] > 800) {