【问题标题】:C++ warning: Not all control paths return a valueC++ 警告:并非所有控制路径都返回值
【发布时间】:2020-03-11 09:34:12
【问题描述】:

嗯,当我输入大小 3 时,我有一些警告会导致我的程序崩溃。
并非所有控制路径都返回值。

我正在尝试解决 N 矩阵、输入、输出和一些操作。我存储第一列

 _vec[0:size-1],last column _vec[size : (size*2)-1]

和对角线

 _vec[size*2 : size*3-2]

1-dimensional 数组中的矩阵。数组大小为matrix * 3 -2。当我重载 () 运算符时会出现问题:

int _size = (_vec.size() +2) /3;   
// when I switch from vector size to normal matrix size. f.e vector size: 7,
// my matrix size is 3. 

int Matrix::operator()(int i, int j) const
    {
        int _size = (_vec.size() +2) /3;
        if ((i >= _size || i < 0) || (j >= _size || j < 0)) throw OVERINDEXED;
        if (i != j && j != 0 && j != _size - 1) return 0;
        else {
            if (j == 0)
            {
                return _vec[i];
            }
            else if (j == _size - 1)
            {
                return _vec[_size + i];
            }
            else if (i == j && j != 0 && j != _size - 1)
            {
                return _vec[(_size * 2) + i];
            }
        }
    }

    int& Matrix::operator()(int i, int j)
    {
        int _size = (_vec.size() +2) /3;
        if ((i >= _size || i < 0) || (j >= _size || j < 0)) throw OVERINDEXED;
        if (i != j && j != 0 && j != _size - 1) throw NULLPART;
        else {
            if (j == 0)
            {
                return _vec[i];
            }
            else if (j == _size - 1)
            {
                return _vec[_size + i];
            }
            else if (i == j && j != 0 && j != _size - 1)
            {
                return _vec[(_size * 2) + i];
            }
        }
    }

【问题讨论】:

  • 函数结束也返回
  • 但我处理了所有案件。哪个控制路径不返回值?你能找到一个吗?
  • else if (i == j &amp;&amp; j != 0 &amp;&amp; j != _size - 1) 替换为else
  • @HolyBlackCat 哦,是的,你是对的。谢谢

标签: c++ matrix vector warnings


【解决方案1】:

需要一些分析来证明所有情况都返回。

看来你的编译器没有做完整的分析

int Matrix::operator()(int i, int j) const
{
    int _size = (_vec.size() + 2) /3;
    if ((i >= _size || i < 0) || (j >= _size || j < 0)) throw OVERINDEXED;
    if (i != j && j != 0 && j != _size - 1) return 0;
    else {
        if (j == 0)
        {
            return _vec[i];
        }
        else if (j == _size - 1)
        {
            return _vec[_size + i];
        }
        else if (i == j && j != 0 && j != _size - 1)
        {
            return _vec[(_size * 2) + i];
        }
        else
        {
             // No return here.
             // But is this case reachable?
             // yes, for (i, j) respecting:
             //    (0 <= i && i < _size) && (0 <= j && j < _size)
             //    && ((i == j) || (j == 0) || (j == _size - 1)) // #2
             //    && (j != 0) && (j != _size - 1)               // #1
             //    && (i != j || j == 0 || j == _size - 1)       // #3
             // which after simplification results indeed in false.
             // #1 simplifies #2 to (i == j) and #3 to (i != j)
        }
    }
}

另一方面,这意味着你做了无用的“测试”,你可以删除(所以请编译器):

int Matrix::operator()(int i, int j) const
{
    int _size = (_vec.size() + 2) /3;
    if ((i >= _size || i < 0) || (j >= _size || j < 0)) throw OVERINDEXED;
    if (i != j && j != 0 && j != _size - 1) return 0;
    else {
        if (j == 0)
        {
            return _vec[i];
        }
        else if (j == _size - 1)
        {
            return _vec[_size + i];
        }
        else // We have necessary (i == j && j != 0 && j != _size - 1)
        {
            return _vec[(_size * 2) + i];
        }
    }
}

【讨论】:

  • 我不明白“#1 将 #2 简化为 (i == j) 和 #3 简化为 (i != j)”的部分,那么永远不会达到 else 。是错字吗?在第二个代码中,您有 (i==j) &amp;&amp; (j != 0)
  • @idclev463035818:当上述所有条件都为假时,达到了else部分。所以我在达到else部分时写下条件。看到它总是错误的并不是微不足道的。对于最后 3 行(标记为 #2、#1、#3),我们有矛盾,例如 i == j &amp;&amp; i != jj == 0 &amp;&amp; j != 0,这允许简化并在任何情况下将最终结果设为 false。
【解决方案2】:

也为第二个函数更改如下代码。

int Matrix::operator()(int i, int j) const
{
    int _size = (_vec.size() + 2) / 3;
    if ((i >= _size || i < 0) || (j >= _size || j < 0)) throw OVERINDEXED;
    if (i != j && j != 0 && j != _size - 1) return 0;
    else {
        if (j == 0)
        {
            return _vec[i];
        }
        else if (j == _size - 1)
        {
            return _vec[_size + i];
        }
        else if (i == j && j != 0 && j != _size - 1)
        {
            return _vec[(_size * 2) + i];
        }
    }
    return 0; // added this line
}

【讨论】:

  • 其他编译器现在可能会警告无法访问的代码。 :-)
  • 如果是else条件,如果不匹配任何条件,你怎么看?
  • 缺少 else 实际上是无法达到的,因为条件匹配所有可能的情况(请参阅我的回答)。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多