为什么这两个程序在 codeforces 上的输出不同,而在 ideone 上却相同?

Why is the output of these 2 programs different on codeforces while they are the same on ideone?

第一个节目:

#include <bits/stdc++.h>
using namespace std;

int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);

for(i=0;i<n;++i)
    cin>>a[i];

i=0;j=0;    
for(;i<n;++i)
{
    if(i>j)
    {
        j=i;
        k=0;
        taken=0;
    }

    for(;j<n;++j)
    {
        if(taken+a[j]<=t)
        {
            taken+=a[j];
            k++;
        }
        else
            break;
    }
    ans=max(ans,k);
    taken-=a[i];
    k--;
}

cout<<ans;
return 0;
}

第二个节目:

  #include <bits/stdc++.h>
  using namespace std;

int main() {
int n,taken,i,j,ans=0,t,num,k;
cin>>n>>t;
vector<int>a(n);

for(i=0;i<n;++i)
    cin>>a[i];


for(i=0;i<n;++i)
{
    if(i>j)
    {
        j=i;
        k=0;
        taken=0;
    }

    for(j=0;j<n;++j)
    {
        if(taken+a[j]<=t)
        {
            taken+=a[j];
            k++;
        }
        else
            break;
    }
    ans=max(ans,k);
    taken-=a[i];
    k--;
}

cout<<ans;
return 0;

}

似乎这 2 个程序给出了 2 个不同的输出,这里有一个测试用例,您可以自己检查一下: 4 5 3 1 2 1

第一个输出“3”,第二个输出“1991243264 “在 codeforces 测试中,这两个程序在 ideone 上给出了相同的输出。有什么帮助吗?

第二个程序调用了未定义的行为,因为您在外部 for 循环的第一次迭代中读取了 j 的值,而没有先对其进行初始化。这种类型的 UB 的一般结果是读取恰好位于该堆栈位置的任何随机数据......这取决于很多因素,并且可能因环境而异。

这些程序中还有很多其他错误。但纯粹就为什么它给你不同的结果而言....这就是原因。

在第一个程序中,您在 for 循环外设置 ij 的值,然后仅在外部 for 循环的 if 语句内更改 j

//...
if(i>j) 
{
    j=i; //<- set j here
    k=0;
    taken=0;
}

for(;j<n;++j) //<- using j from above
{
//...

在您的第二段代码中,每次 for 循环为 运行 时,您都将 j 重置为零。在进入第一个 for 循环之前,您也永远不会将 j 设置为一个值,因此当您在 if 语句中使用 j 时,它将调用 undefined behavior.

//...
if(i>j) // j is uninitialized here so you could get anything
{
    j=i; //<- set j here
    k=0;
    taken=0;
}

for(j=0;j<n;++j) //<- set j to zero here
{
//...

在第二个程序中j未初始化。

for(i=0;i<n;++i)
{
   if(i>j)//j is uninitialized here
    {