我进行了搜索,但没有找到与我的查询相关的内容。 我目前正在调试 C 优化器,有问题的代码如下所示:
while( x-- )
array[x] = NULL;
在这种情况下应该发生什么?这种逻辑的结果是否应该在所有编译器中保持一致?
假设在这种情况下 x 的初始值为 5。
问题是程序崩溃了,我的理解是引用负数组元素引起的。
如有任何帮助,我们将不胜感激。
最佳答案
此循环将以 x
等于 -1
结束(假设 x
已签名),但其主体不会产生对 array[-1]
在最后一步。最后一个数组访问是 array[0]
。该行为在所有实现中都是一致的。
换句话说,您引用的代码中的负索引数组访问没有问题。但是,如果您尝试在循环后立即访问 array[x]
,那么您确实会访问 array[-1]
。
您引用的代码是一个相当知名的实现模式的变体,当需要使用 unsigned 变量作为索引对数组进行反向迭代时使用。例如
unsigned x;
int a[5];
for (x = 5; x-- > 0; )
a[x] = 0;
有时,经验不足的程序员在向后遍历数组时会遇到使用无符号索引的麻烦。 (由于无符号变量永远不会有负值,因此将循环终止条件简单地实现为 x >= 0
是行不通的。)这种方法 - 即循环终止条件中的后递增 - 是有效的在这种情况下。 (当然,它也适用于带符号的索引)。
关于c - 在 C 中的 while 条件下递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5374080/