c - 使用无符号索引在 C 中向后迭代数组

标签 c arrays loops unsigned

以下代码可以安全地向后迭代数组吗?

for (size_t s = array_size - 1; s != -1;  s--)
    array[s] = <do something>;

请注意,我正在比较 s,它是 unsigned,与 -1

有没有更好的办法?

最佳答案

这段代码非常棘手。如果我对 C 标准的解读是正确的,那么你的代码是安全的 size_t至少和int一样大.这通常是因为 size_t通常实现为类似 unsigned long int 的形式.

在这种情况下 -1转换为 size_t ( s 的类型)。 -1不能用无符号类型表示,因此我们应用模运算将其置于范围内。这给了我们 SIZE_MAX (类型的最大可能值 size_t )。同样,递减 s当它是0SIZE_MAX+1为模完成,这也会导致 SIZE_MAX .因此,在处理完 s = 0 之后,您的循环恰好在您希望它结束​​的地方结束。案例。

另一方面,如果size_t类似于 unsigned short (和 int 大于 short ),然后是 int可以代表所有可能的size_t值和 s将转换为 int .换句话说,比较将作为 (int)SIZE_MAX != -1 进行。 ,它总是会返回 false ,从而破坏您的代码。但我从未见过会发生这种情况的系统。


您可以使用 SIZE_MAX 来避免任何潜在的问题(由 <stdint.h> 提供)而不是 -1 :

for (size_t s = array_size - 1; s != SIZE_MAX;  s--)
    ...

但我最喜欢的解决方案是:

for (size_t s = array_size; s--; )
    ...

关于c - 使用无符号索引在 C 中向后迭代数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805809/

相关文章:

c - 强制执行 volatile 内存位置访问的正确顺序

ios - Obj-c 如何继承一个有参数数组的方法?

java - 我可以将paintComponents() 添加到数组中吗?

javascript - 循环遍历 JSON 数组不起作用

css - 循环变量中的 SASS 循环

c++ - 使用 Bison 的文件指针追加字符串

java - JVM 如何使用 ArrayName.length 属性计算数组长度?

c++ - 如何将文件读入字符串数组;奇怪的错误

javascript - 根据先前对象数组中的共享属性创建新对象

python - 如何通过 while 循环以 python 方式避免此代码重复?