为什么这两个程序的输出在代码强制上是不同的,而在ideone上它们是相同的?

时间:2015-07-16 14:09:03

标签: c++ output

第一个程序:

#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

第一个输出&#34; 3&#34;而第二个输出&#34; 1991243264 &#34;关于codeforces测试,而2个程序在ideone上提供相同的输出。有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

在第一个程序中,您在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
{
//...

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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