簡體   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