我进行了搜索,但没有发现与我的查询相关的内容。我目前正在调试一个 C 优化器,有问题的代码如下所示:
while( x-- )
array[x] = NULL;
在这种情况下应该发生什么?这个逻辑的结果是否应该在所有编译器中保持一致?
假设在这种情况下 x 的初始值为 5。
问题是程序崩溃了,我的理解是是负数组元素引用引起的。
任何帮助,将不胜感激。
我进行了搜索,但没有发现与我的查询相关的内容。我目前正在调试一个 C 优化器,有问题的代码如下所示:
while( x-- )
array[x] = NULL;
在这种情况下应该发生什么?这个逻辑的结果是否应该在所有编译器中保持一致?
假设在这种情况下 x 的初始值为 5。
问题是程序崩溃了,我的理解是是负数组元素引用引起的。
任何帮助,将不胜感激。
此循环将以x
等于-1
(假设x
已签名)结束,但其主体不会array[-1]
在最后一步产生访问权限。最后一个数组访问是array[0]
. 该行为在所有实现中都是一致的。
换句话说,您引用的代码中的负索引数组访问没有问题。但是,如果您尝试array[x]
在循环后立即访问,那么您确实会访问array[-1]
.
您引用的代码是一种相当知名的实现模式的变体,当需要使用无符号变量作为索引对数组进行向后迭代时使用。例如
unsigned x;
int a[5];
for (x = 5; x-- > 0; )
a[x] = 0;
有时,经验不足的程序员在向后迭代数组时会遇到使用无符号索引的问题。(由于无符号变量永远不会有负值,循环终止条件的幼稚实现x >= 0
不起作用。)这种方法 - 即循环终止条件中的后增量 - 在这种情况下是有效的。(当然,它也适用于有符号索引)。
如果 的初始值为x
5,它将执行:
array[4] = NULL;
array[3] = NULL;
array[2] = NULL;
array[1] = NULL;
array[0] = NULL;
如果是有符号类型,则 的最终x
值为; 否则,它将是该类型的最大值。x
-1
在处理循环(前提条件)之前确保x
它是非负数。当进程离开循环(后置条件)时,值while
也将为-1。因此,离开循环后,您不应该访问using as index。x
while
while
array
x