在 for 循环条件中递增

Sta*_*zee 3 c performance for-loop

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

int tmp;    
for (tmp = PIDTYPE_MAX; --tmp >= 0; )
Run Code Online (Sandbox Code Playgroud)

为什么不这样做:

for (tmp = PIDTYPE_MAX; tmp >= 0; tmp--)
Run Code Online (Sandbox Code Playgroud)

这是一种for循环优化吗?

M O*_*ehm 5

你的循环不等价:第二个循环包括上限PIDTYPE_MAX,第一个没有。

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

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

无符号类型 likesize_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
Run Code Online (Sandbox Code Playgroud)