C++ 警告:并非所有控制路径 return 一个值
C++ warning: Not all control paths return a value
嗯,当我输入尺寸 3 时,有一些警告会导致我的程序崩溃。
不是所有控制路径return一个值。
我正在尝试解决 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];
}
}
}
也为第二个函数更改如下代码。
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
}
需要一些分析来证明所有情况return。
而且您的编译器似乎没有进行完整的分析
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)
}
}
}
另一方面,这意味着您可以删除无用的"tests"(因此请编译器):
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];
}
}
}
嗯,当我输入尺寸 3 时,有一些警告会导致我的程序崩溃。
不是所有控制路径return一个值。
我正在尝试解决 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];
}
}
}
也为第二个函数更改如下代码。
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
}
需要一些分析来证明所有情况return。
而且您的编译器似乎没有进行完整的分析
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)
}
}
}
另一方面,这意味着您可以删除无用的"tests"(因此请编译器):
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];
}
}
}