【问题标题】:Incrementing in for loop conditionfor循环条件递增
【发布时间】:2020-03-03 06:11:54
【问题描述】:

在浏览Linux源代码时,我遇到了以下line

int tmp;    
for (tmp = PIDTYPE_MAX; --tmp >= 0; )

为什么不这样做:

for (tmp = PIDTYPE_MAX; tmp >= 0; tmp--)

这是another 之类的 for 循环优化吗?

【问题讨论】:

  • 您的循环不等效。通过在循环体之前递减迭代器变量可确保条件0 <= tmp < PIDTYPE_MAX 始终为真。这实际上是 C 中的规范反向循环,其中下限包含在内,上限不包含在内。 (但我更喜欢tmp-- > 0,它也适用于无符号类型。)
  • 是的,这是有道理的。如果您将评论更改为答案,我很乐意将其标记为答案。谢谢!

标签: c performance for-loop


【解决方案1】:

您的循环不等效:第二个循环包含上限 PIDTYPE_MAX,第一个不包含。

在循环体之前递减迭代器变量可确保条件0 <= tmp < PIDTYPE_MAX 在循环中始终为真。这实际上是 C 中规范的反向循环,其中下限包含在内,上限不包含在内。

请注意,第一个循环需要有符号整数才能工作,因此tmp >= 0 的测试是有意义的。 (对于无符号整数总是如此。)

size_t 这样的无符号类型通常用于数组索引和计数,不能为负数。各自的循环是:

for (size_t i = 0; i < N; i++) ...     // iterate over [0, N) forwards
for (size_t i = N; i-- > 0; ) ...      // iterate over [0, N) backwards

【讨论】:

    【解决方案2】:

    在第一种情况下,temp 的值将在进入循环之前递减。而在第二种情况下,temp的值将在循环体执行后递减。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多