[英]Removing cout statement causing value change of a variable
在以下代碼中,當我刪除cout語句(// ******之后的行)時,這會導致“ i”的值發生變化。 我使用了TDM-GCC 4.9.2 32位版本和TDM-GCC 5.1.0編譯器。 我在codechef上運行了此代碼,並且在這里運行良好,並且cout語句不影響“ i”的值。
#include<iostream>
using namespace std;
int subset(int [], int);
int main()
{
int size,i,ans;
cout<<"size of array : ";
cin>>size;
int arr[size];
for(i = 0 ; i<size;i++)
{
cin>>arr[i];
}
ans = subset(arr,size);
cout<<"ans = "<<ans;
return 0;
}
int subset(int arr[], int size)
{
int i,j, tsum=0, completed=0;
for(i = 0 ;i<size;i++)
tsum = tsum + arr[i];
int carr[tsum+1],temp;
for(i=0;i<size;i++)
{
temp = arr[i];
carr[temp] = 1;
for(j=i+1;j<size;j++)
{
temp = temp + arr[j];
carr[temp] = 1;
}
}
for(i=1;i<=tsum;i++)
{
if(carr[i]!=1)
{
//************************************
cout<<"i : "<<i<<endl;
break;
}
}
return i;
}
樣本輸入:數組大小:3
1 2 5
沒有cout語句的示例輸出:
ans = 6
具有cout語句的示例輸出:
我:4
ans = 4
輸入的實際答案為4。
主要問題似乎是carr
初始化。
聲明為
int carr[tsum+1]
沒有初始化程序。
稍后設置一些元素,但始終設置為1
:
carr[temp] = 1;
在最后一個循環中,檢查carr
:
if(carr[i]!=1)
這種情況是沒有道理的。 設置了carr[i]
,然后保證它為1
,或者未初始化,在這種情況下,此比較具有未定義的行為。
請注意,可變長度數組不是標准的C ++。
為了解決某些程序員Dude和melpomene所說的問題, 即可變長度數組不是標准的C ++,並且carr
未初始化。 使用c ++向量並正確初始化它們。 看起來像這樣:
#include <iostream>
#include <vector>
using namespace std;
int subset(const std::vector<int>, const int);
int main()
{
int size, i, ans;
cout << "size of array : ";
cin >> size;
std::vector<int> arr(size);
for (i = 0; i < size; i++)
{
cin >> arr[i];
}
ans = subset(arr, size);
cout << "ans = " << ans;
return 0;
}
int subset(const std::vector<int> arr, const int size)
{
int i, j, tsum = 0, completed = 0;
for (i = 0; i < size; i++)
tsum = tsum + arr[i];
std::vector<int> carr(tsum + 1, 0);
int temp;
for (i = 0; i < size; i++)
{
temp = arr[i];
carr[temp] = 1;
for (j = i + 1; j < size; j++)
{
temp = temp + arr[j];
carr[temp] = 1;
}
}
for (i = 1; i <= tsum; i++)
{
if (carr[i] != 1)
{
//************************************
cout << "i : " << i << endl;
break;
}
}
return i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.