簡體   English   中英

刪除導致變量值更改的cout語句

[英]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 ++。

為了解決某些程序員Dudemelpomene所說的問題, 即可變長度數組不是標准的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM