c - 在 C 中的 while 条件下递减

标签 c post while-loop optimization decrement

我进行了搜索,但没有找到与我的查询相关的内容。 我目前正在调试 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/

相关文章:

c - | (或者C语言中的正则表达式中运算符不起作用)

c - C中udp套接字上的poll()POLLIN事件

angularjs - 避免在 AngularJS 中使用 $resource 发送选项(预检)的最佳方法是什么

bash - 不会记住在 while 循环内修改的变量

html - 如何使用 css 网格生成带有元素列表的独特布局?

c - 链表节点被错误覆盖

c - C 中的线程如何工作?

php - 使用 POST android 发送 php 数组

php - 更新 MySQL 文本字段行时生成不需要的反斜杠

c++ - goto 和 junping 循环循环 c++