C ++未初始化变量的模糊行为

时间:2015-10-26 04:41:43

标签: c++ output buffer

以下代码的行为就好像我已将变量 res 初始化为0,如果我在第一次使用它时取消注释行。

int t, mi,cur,n,res;

scanf("%d",&t);
while(t-- && scanf("%d",&n) == 1)
{
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d",&h[i]);
    }
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d",&k[i]);
    }

    for (int i = 0; i < 1001; ++i)
        dp[0][i] = INF;
    for (int i = 0; i < 501; ++i)
        dp[i][0] = 0;


    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= 2*n; ++j)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= k[i-1])
                dp[i][j] = min(dp[i-1][j],1 + dp[i][j-k[i-1]]);
        }
    }
    // The lines below.
    //for (int i = 0; i <= n; ++i)
    //{
    //  for (int j = 0; j <= 2*n; ++j)
    //  {
    //      printf("%d ", dp[i][j]);
    //  }
    //  printf("\n");
    //}

    for (int i = 1; i <= n; ++i)
    {
        res += dp[n][2*h[i]];
    }
    printf("%d\n", res);

当我用注释的行打印res的值时,它给了我垃圾值,但是当我取消注释它时,它给了我预期的值。我不了解该语言的高级概念。为什么会这样?

1 个答案:

答案 0 :(得分:0)

从索引1开始填充数组时,

dp[0][*]dp[*][0]未初始化。

然后,如果h[i]为0,您肯定会将一个酉值复制到res

在这种情况下,advanced concepts of the language只是未初始化的变量导致未定义的行为,不应该使用。见Default variable value(由Kelvin Lai评论)。

所以你可以接受这一点,并且不要试图弄清楚为什么打印这些值会解决问题....因为没有必要试图确定未定义的行为是如何工作的......; - )

注意:帖子中的注释行修复问题的事实可能是编译器/平台/配置特定的。它只是一种极端情况,可以解决未初始化变量在不应该使用时的问题......