c++ - 在 size_t 中使用负整数是否安全?

标签 c++ c++11 unsigned size-t

我刚刚看到一些像这样的 C++ 代码。它使用一个条件来决定是通过 std::vector 向前走还是向后走。编译器没有提示,但我认为 size_t 是未签名的。这很危险吗?

vector<int> v { 1,2,3,4,5 };    
bool rev = true;

size_t start, end, di;
if (rev) {
    start = v.size()-1;
    end = -1;
    di = -1;
}
else {
    start = 0;
    end = v.size();
    di = 1;
}

for (auto i=start; i!=end; i+=di) {
    cout << v[i] << endl;
}

最佳答案

以这种方式使用无符号整数(并且 size_t 是无符号的)是明确定义的,带有环绕:该行为由标准保证,而不是有符号整数,它不由标准。

然而,它是不必要的聪明。

作为一般规则,为了避免由于隐式包装提升为无符号而引起的问题,对位级的东西使用无符号整数,对数字使用有符号整数。在您需要对应于 size_t 的有符号整数的地方,有适合您的 ptrdiff_t。定义一个带有签名结果的 n_items 函数,例如

using Size = ptrdiff_t;

template< class Container >
auto n_items( Container const& c )
    -> Size
{ return end( c ) - begin( c ); }

您就可以开始了,编译器不会再发出愚蠢的警告了。


而不是过于聪明的给定代码

vector<int> v { 1,2,3,4,5 };    
bool rev = true;

size_t start, end, di;
if (rev) {
    start = v.size()-1;
    end = -1;
    di = -1;
}
else {
    start = 0;
    end = v.size();
    di = 1;
}

for (auto i=start; i!=end; i+=di) {
    cout << v[i] << endl;

做例如

const vector<int> v { 1,2,3,4,5 };    
const bool reverse = true;  // whatever

for( int i = 0; i < n_items( v );  ++i )
{
    const int j = (reverse? n_items( v ) - i - 1 : i);
    cout << v[j] << endl;
}

关于c++ - 在 size_t 中使用负整数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247733/

相关文章:

c++ - 子类/继承标准容器?

android - 单色机器人 : Unsigned Binary upload to Amazon

c++ - ISO C++ 禁止声明没有自动迭代器类型的 ‘it’?

c++ - 错误 "An array may not have elements of this type"

c++ - 带有 gcc stdlib 的 icpc C++11

c++ - 在类定义中声明随机类的对象

c - C 中的阶乘程序在 20 之后是错误的

c++ - 在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

c++ - 来自结构类型的队列

c++ - 管理生命周期但也复制内存的智能指针