【发布时间】:2017-04-27 02:49:00
【问题描述】:
目前正在做 CS50 讲座,在第 2 周,从该视频 (https://video.cs50.net/2016/fall/lectures/2?t=56m50s) 的大约 56:45 开始,他提到应该将 strlen 函数移到 for 循环的初始化变量部分,而不是留在条件部分,因为将其留在条件部分会使计算机在每次 for 循环递增时运行 strlen 函数。
好的,我明白了,但是建议的解决方案——将它移到变量声明部分,并不能解决问题,是吗?因为它仍在for 循环中,所以看起来strlen 函数在每次for 循环迭代时仍在被检查。
我错了吗?
【问题讨论】:
-
这可能就是它的呈现方式(我没有看过视频,所以我无法进一步评论)。但基本上:在初始化部分,它运行一次,因为您只初始化一次(在开始时,在循环开始时设置变量状态)。将其留在条件中将在每次迭代时调用它,因为您必须在每次迭代时检查条件(以了解您是否仍在条件内)。
-
写
for (int len = strlen(str), i = 0; i < len; i++)比写for (int i = 0; i < strlen(str); i++)好得多。for循环的初始化部分只执行一次——而不是每次迭代。 (我们可以就intvssize_t和类似问题进行辩论。我经常在循环之外完全写给strlen()的调用。) -
感谢 AntonH 和乔纳森。只是跟进,
int与size_t的辩论是什么?