我知道无符号整数是臭名昭著的并且通常被 C++ 开发人员避免。我有一个包含两个
int
成员变量的类,这些变量不应包含负值:
.
.
.
private:
int m_Y_AxisLen;
int m_X_AxisLen;
.
.
.
我以防止输入任何负数的方式设计了成员函数的逻辑。所以我确保这两个成员不会被分配负值。
但是当我使用PVS-Studio时,这也会带来一些警告。例如这里:
for ( int row = 0; row < getY_AxisLen( ); ++row )
{
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
{
if ( m_characterMatrix[ row ][ column ] == getFillCharacter( ) )
{
m_characterMatrix[ row ][ column ] = fillCharacter;
}
}
}
PVS-Studio 因索引
row
和 column
不属于 memsize
类型而责怪我。这可能意味着我应该使用 std::size_t row
和 std::size_t column
??getY_AxisLen( )
(返回 int
)进行比较是危险的。private:
uint32_t m_Y_AxisLen;
uint32_t m_X_AxisLen;
我虚心向以前处理过此类问题的专业人士寻求见解和建议。当谈到这些问题时,你会采取什么方法?
很多“你不应该使用无符号整数”基本上只是害怕你会混淆有符号整数和无符号整数,导致环绕,或者避免复杂的整数提升规则。
但是在您的代码中,我认为没有理由不使用
std::uint32_t
和 std::size_t
,因为 m_X_AxisLen
和 m_Y_AxisLen
不应包含负值,并且使用 std::uint32_t
和 std::size_t
在这里更有意义:
所以,我建议将
m_X_AxisLen
和 m_Y_AxisLen
更改为:
std::size_t m_Y_AxisLen;
std::size_t m_X_AxisLen; // for consistency
将
row
和 column
更改为
std::size_t row = 0;
// and
std::size_t column = 0;
Make
getX_AxisLen( )
返回 std::size_t
并制作
for
循环:
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
至:
for ( int column = 0; column + 1 < getX_AxisLen( ); ++column )
因为如果
getX_AxisLen()
返回 0
,getX_AxisLen( ) - 1
将导致环绕。
基本上,使用有意义的东西。如果值不能为负数,请使用
unsigned
类型。