[英]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.