gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:53 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com