注释掉cout语句会导致输出不同(和不正确)

时间:2013-06-20 03:04:29

标签: c++ multidimensional-array

我从未经历过这样的事情。我正在使用cout语句来帮助我调试一个小程序,一旦我对我的代码感到满意,我就注释掉了cout。现在,代码不再有效。下面是cout注释掉的代码。

该程序的目的是测试两个硬编码的布尔二维数组,以便在每一行上具有奇数个真实语句。因此,第一个数组应返回true,第二个数组应返回false。使用cout语句注释掉两者都返回false。

#include <iostream>

using namespace std;

template <size_t size_y>
bool findEvenDegrees(bool mapArray[][size_y])
{
    bool returnValue;
    for (int x=0; x<size_y; x++)
    {
        int result = 0;
        for (int y=0; y<size_y; y++)
        {
            result = result + mapArray[x][y];
            //the line below causes the problem
            cout << mapArray[x][y] << "\t" << result << "\t" << x << endl;
        }
        if (result%2 == 1)
        {
            returnValue = false;
            break;
        }
    }
    if (returnValue== false)
    {
        return returnValue;
    }
    else
    {
        return true;
    }
}

int main()
{
    bool array1[][6] =
    {
        {false,true,true,false,false,false},
        {true,false,false,true,false,false},
        {true,false,false,true,false,false},
        {false,true,true,false,true,true},
        {false,false,false,true,false,true},
        {false,false,false,true,true,false}
    };
    bool array2[][8] =
    {
        {false,true,true,false,false,false,false,false},
        {true,false,false,true,false,false,false,false},
        {true,false,false,true,false,false,false,false},
        {false,true,true,false,true,false,false,false},
        {false,false,false,true,false,true,true,false},
        {false,false,false,false,false,true,false,true},
        {false,false,false,false,true,false,false,true},
        {false,false,false,false,false,true,true,false}
    };
    bool answer1 = findEvenDegrees(array1);
    bool answer2 = findEvenDegrees(array2);
    if (answer1 == true)
    {
        cout << "Array 1 has a even degree for every switch." << endl;
    }
    else
    {
        cout << "Array 1 has a odd degree for at least one switch." << endl;
    }
    if (answer2 == true)
    {
        cout << "Array 2 has a even degree for every switch.";
    }
    else
    {
        cout << "Array 2 has a odd degree for at least one switch.";
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您永远不会初始化returnValue。如果它恰好以false开头,它将保持这种状态,并且该函数将返回false

答案 1 :(得分:1)

首先,我稍微清理了一下你的代码,然后到达:

#include <iostream>

template <size_t S>
bool findEvenDegrees(bool (&themap)[S][S]) {
  for( bool(&row)[S]: themap ) {
    bool is_degree_odd = false;
    for( auto col: row )
      is_degree_odd ^= col;
    if( is_degree_odd )
      return false;
  }
  return true;
}

int main()
{
  using std::cout;
  using std::endl;

  bool array1[6][6] = {
    {false,true,true,false,false,false},
    {true,false,false,true,false,false},
    {true,false,false,true,false,false},
    {false,true,true,false,true,true},
    {false,false,false,true,false,true},
    {false,false,false,true,true,false}
  };
  cout << "Array 1 has an "
    << (findEvenDegrees(array1) ? "even degree for every" : "odd degree for at least one")
    << " switch." << endl;

  bool array2[8][8]= {
    {false,true,true,false,false,false,false,false},
    {true,false,false,true,false,false,false,false},
    {true,false,false,true,false,false,false,false},
    {false,true,true,false,true,false,false,false},
    {false,false,false,true,false,true,true,false},
    {false,false,false,false,false,true,false,true},
    {false,false,false,false,true,false,false,true},
    {false,false,false,false,false,true,true,false}
  };
  cout << "Array 2 has an "
    << (findEvenDegrees(array2) ? "even degree for every" : "odd degree for at least one")
    << " switch." << endl;

  return 0;
}

在清理它的过程中,我通过在找到第一个奇数行时有效返回来消除if(result%2 == 1) { resultValue = true; break; }。当我删除resultValue变量时,我也杀死了@sth提到的“单元化”错误。