我当时正在读"The GNU C Programming Tutorial",我想我发现了一个非常小而微妙的错误。就在这个chapter上。在delete_multiples_of_prime(...)函数中,在for循环中:
delete_multiples_of_prime (int prime)
{
int index, multiplier = 2;
for (index = prime * multiplier; index < ARRAY_SIZE; index = prime * multiplier++)
sieve[index] = DELETED;
}我认为问题在for的增量部分。作者用后增量操作符代替了增量前操作符,考虑到这一点,我认为循环将以初始索引值执行两次。
我说的对吗?
注:我很确定我是对的,如果我在别的地方找到了它,我不会发这个,但是在那里.这让我怀疑。当然,我知道即使我是对的,表现上的差异也是可以忽略不计的。
发布于 2017-07-14 23:29:51
对于第一个索引,循环运行两次是正确的。
但是,这不是一个bug,因为赋值是一个幂等操作,因此一个给定索引的多个赋值不会有进一步的影响或副作用。即使第一个索引被重复了两次,函数的工作方式也是一样的。
性能,差异应该可以忽略不计,因为每个函数调用只需要额外分配一次。(由于幂等性,编译器也可以简单地对其进行优化)。
尽管如此,为了清楚起见,如果for循环体被更改为不再幂等(例如添加printf语句),我将亲自使用前缀增量:
for (index = prime * multiplier; index < ARRAY_SIZE; index = prime * ++multiplier)https://stackoverflow.com/questions/45112705
复制相似问题