繁体   English   中英

使用 ptrdiff_t 或 size_t 进行索引

[英]Use ptrdiff_t or size_t for indexing

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

for (size_t i = n-1; i >= 0; i--) {
    // ...
}

当 body 运行i == 0时,它会递减并回绕,可能是SIZE_T_MAX 这使得中断条件成为重言式。 可能有一些巧妙的位操作来检查可能的下溢,但使用ptrdiff_t不是更简单吗?

解决此问题的正确惯用 C 方法是什么? size_t加上有点玩弄或ptrdiff_t并且对语义感到不舒服?

向后循环应如下所示:

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

n - i - 1是与i对应的“反向迭代器”(如果可以的话)。

这是编写向下循环的更安全的方法:

  • 它适用于有符号或无符号索引类型,
  • 它只使用一次未修改的数组长度。 如果arr被定义为一个数组,你也可以写i = sizeof(arr) / sizeof(*arr)
  • i按降序获取所有有效索引值。
for (size_t i = n; i-- > 0;) {
    arr[i] = compute_value(i);
}

可以将i --> 0写成吸引眼球的成语,但一些专家似乎不同意这种选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM