在添加不相关的代码行后,为什么我的代码会有所不同?

时间:2019-10-05 20:28:46

标签: c++

我想获取数组中三个最大数字的总和。将它们升序排序后,我将最后三个求和即可得出结果。这是有趣的事情发生的时候-在计算总和之前,我在其中测试了排序的注释代码实际上是使代码正确的原因。当我删除/评论它时,答案变得不同。

然后,我尝试仅打印n,它再次正常工作,并且在对其进行注释后,结果再次错误地更改了。

int main()
{

    int n;
    cout<<"n: ";
    cin>>n;

    int a[n-1];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-i;j++)
        {
            if(a[j]>a[j+1])
            {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
/*
for(int i=0;i<n;i++)
{
    cout<<a[i]<<" ";
}
*/

cout<<endl;

//cout<<n<<endl;

int ourSum = a[n-1] + a[n-2] + a[n-3];

if(n>2)cout<<"The sum of the 3 biggest is "<<ourSum<<endl;
else cout<<"Need at least three numbers"<<endl;

打印周期或n打印: n:6 654321 1 2 3 4 5 6 3个最大的总和是15

没有上面正在评论的东西: n:6 654321 3个最大的总和是12

因此,当评论处于活动状态时,答案将正确显示:15.但是,当评论/删除评论时,结果为12。我不知道是什么原因造成的,因此在此我希望能得到一个解释。

1 个答案:

答案 0 :(得分:0)

int a[n-1];
for(int i=0;i<n;i++)
{
    cin>>a[i];
}

您分配的内存少于实际使用的内存。期。这是一种不确定的行为,请享受您的鼻重音。自您进入UB的世界以来,一切都可以观察到。

分配n个整数,而不是n-1

我不会夸大您重新实现气泡排序的尝试,即使与经典气泡排序实现相比,它的效率也很低,如果n小于3,您会得到另一个UB ...我想这是出于您的问题范围。