C 使用ptrdiff\u t或size\u t进行索引

C 使用ptrdiff\u t或size\u t进行索引,c,indexing,size-t,C,Indexing,Size T,我养成了用size_t而不是int声明for循环索引的习惯。但是,当我向后迭代数组时,这已经多次出价,即检查索引是否大于或等于零: for (size_t i = n-1; i >= 0; i--) { // ... } 当主体已经运行了i==0时,它将被递减并环绕,可能达到大小\u T\u MAX。这使得break条件成了同义反复。可能会有一些巧妙的位操作来检查可能的下溢,但是使用ptrdiff\t不是更简单吗 解决这个问题的正确惯用C方法是什么?大小加上位旋转或ptrdiff

我养成了用size_t而不是int声明for循环索引的习惯。但是,当我向后迭代数组时,这已经多次出价,即检查索引是否大于或等于零:

for (size_t i = n-1; i >= 0; i--) {
    // ...
}
当主体已经运行了i==0时,它将被递减并环绕,可能达到大小\u T\u MAX。这使得break条件成了同义反复。可能会有一些巧妙的位操作来检查可能的下溢,但是使用ptrdiff\t不是更简单吗


解决这个问题的正确惯用C方法是什么?大小加上位旋转或ptrdiff,并对语义感到不舒服?

反向循环应如下所示:

for (size_t i = 0; i != n; ++i) {
    arr[n - i - 1] = foo();
}

如果您愿意,n-i-1是与i相对应的反向迭代器。

@haccks然后,在几种常见的平台上,您被限制为比物理内存量合理支持的数组大小小得多的数组大小。更糟糕的是,编译器将基于未定义的int-overflow进行优化,当它发生溢出时会出现非常奇怪的行为,而且由于它需要非常极端的输入,因此很难找到和再现与此相关的任何问题。我的GCC 4.7似乎没有注意到重言式编辑:使用-Wextra,确实如此,但是我的叮当声3.2在墙上警告了它。所以我想启用警告是另一种解决方案?可能是,我只是想知道我是否“用正确的方法”来做。