以下代码可以安全地向后迭代数组吗?
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
当它是0
以SIZE_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/