在C中的条件下减少

Ahm*_*ura 4 c optimization post while-loop decrement

我已完成搜索,但我发现与查询无关.我目前正在调试C优化器,有问题的代码如下所示:

while( x-- )
array[x] = NULL;
Run Code Online (Sandbox Code Playgroud)

在这种情况下会发生什么?并且这个逻辑的结果是否应该在所有编译器中保持一致?

让我们说在这种情况下x的初始值是5.

问题是程序崩溃,我的理解是它是由负数组元素引用引起的.

任何帮助,将不胜感激.

AnT*_*AnT 7

此循环将以x等于-1(假设x已签名)结束,但其正文将不会array[-1]在最后一步生成访问权限.最后一个数组访问是array[0].所有实现中的行为都是一致的.

换句话说,您引用的代码中的负索引数组访问没有问题.但是如果你试图array[x]在循环后立即访问,那么你确实可以访问array[-1].

您引用的代码是一个相当熟知的实现模式的变体,当需要使用无符号变量作为索引向后迭代数组时使用.例如

unsigned x;
int a[5];

for (x = 5; x-- > 0; )
  a[x] = 0;
Run Code Online (Sandbox Code Playgroud)

有时经验不足的程序员在向后迭代数组时无法使用无符号索引.(由于无符号变量从不具有负值,因此循环终止条件的初始实现x >= 0不起作用.)这种方法 - 即循环终止条件中的后增量 - 在这种情况下有效.(当然,它也适用于签名索引).