【问题标题】:CS50: For Loop DesignCS50:循环设计
【发布时间】: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 循环的初始化部分只执行一次——而不是每次迭代。 (我们可以就int vs size_t 和类似问题进行辩论。我经常在循环之外完全写给strlen() 的调用。)
  • 感谢 AntonH 和乔纳森。只是跟进,intsize_t 的辩论是什么?

标签: c for-loop cs50 strlen


【解决方案1】:

好吧,在for循环中不会每次都调用strlen函数,因为我们在for循环之前存储了strlen的值, 它看起来像这样

`int n= strlen(s);
 for(int i=0;i<n;i++)
 { 
     code
  }

`

一旦 strlen 的值存储在 n 中,计算机只需要访问 n 而不是一次又一次地从 string.h 库中访问 strlen 希望这个答案有帮助:)

【讨论】:

    【解决方案2】:

    “for()”循环的“初始化”部分只运行一次。

    for() 循环的“条件”部分在每次循环迭代开始时运行。

    for() 循环的“步骤”部分在每次循环迭代结束时运行。

    这就是为什么重复的操作,比如对strlen()的调用应该移到初始化部分(应该设置一个局部变量)

    【讨论】:

    • 谢谢。将strlen 调用置于for 循环之外(之前)并将其分配给一个变量,然后在for 循环中引用该变量(假设该变量将在其他地方使用,而不仅仅是 for 循环)?
    • 编写代码时,作者应始终力求可读性。出于这个原因,I 会在for() 循环之前调用strlen(),但是任何一种方法都可以。
    猜你喜欢
    • 2020-12-11
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2019-03-14
    相关资源
    最近更新 更多