有谁能弄清楚这段代码是如何显示运行错误的?它在打印无限时间-1的同时,也打印了正确的答案

问题描述 投票:0回答:1
#include <iostream>
using namespace std;

int subarraysum(int arr[],int n,int sum){
    int cur_sum=0,start=0;
    for(int i=0;i<n;i++){

     cur_sum=cur_sum+arr[i];

    while(start<i && cur_sum>sum){
        cur_sum=cur_sum-arr[start];
        start++;
         }

    if(cur_sum==sum)
     {
         cout<<start<<" "<<i;
         return 1;
     }
    }
    cout<<"-1";
  //return 0;  
}
int main() {
    int t;
    cin>>t;
    for(int l=0;l<t;t++){
        int n,s;
    cin>>n>>s;
    int arr[n]={0};
    for(int i=0;i<n;i++)
    {cin>>arr[i];
    }

    subarraysum(arr, n, s);

    }
return 0;
}

这道题是一个简单的输入输出题,但它打印了我的答案和无限次的-1,我无法找出这段代码的问题和它的运行时间错误问题。

c++ runtime-error infinite-loop
1个回答
0
投票

我认为这里的问题确实很棘手。你声明了一个函数 int subarraysum(int arr[],int n,int sum). 这里的问题是返回语句。你的函数 必须 返回一个值,但你的代码没有,在这种形式下。这将导致未定义的行为。在 int main()-函数,是C++中唯一一个在C++中具有 non-void-返回值,是允许不返回任何东西的。

根据你的编译器的优化水平,这种未定义的行为可能会导致无休止的循环,即使是在 for-在缝隙前循环退出。试着取消注释 return 0; 在函数结尾处,这应该可以完成任务。

顺便说一下,调试你的代码对你没有帮助,因为在调试模式下的行为是不同的。在调试模式下,一切都可能是正常的。编译你的代码时,把所有的警告都放在 -Wall -Wextra -pedantic. 编译器会告诉你可能有问题。像对待错误一样对待警告。

© www.soinside.com 2019 - 2024. All rights reserved.