【问题标题】:How does a computer proceed nested while loops?计算机如何进行嵌套的 while 循环?
【发布时间】:2021-03-17 14:48:42
【问题描述】:

我正在学习使用 Swift Playgrounds 进行编程,但我不理解“嵌套循环”一节中的某些内容。我试图概括它,因为我的问题是关于计算机如何运行代码的非常基本的问题。所以这是一个伪代码:

当 A {While A {!A}, A}

它表示当 A 执行以下操作:当 A 执行非 A,否则执行 A。

问题 #1:假设初始状态是 A。这意味着 While 循环已启动,嵌套的 While-Loop 也是如此!A。我希望此时 both While-Loops 停止,因为这两个条件都是错误的。但似乎发生的事情是这样的:只有内部 while 循环(执行 !A)因为 !A 而停止,然后 A 完成,然后外部 While 循环再次被检查并被启动(因为 A 为真)和整个事情无限重复。这个观察是真的吗?计算机是这样进行嵌套的 while 循环的,只有内部循环,如果内部循环失败,他会切换到外部循环?

问题 #2:我问是因为我们不这么认为。如果一个人执行如下命令:while A 执行以下操作:while A,执行 Non-A,否则为 A,他会在内部 while 循环产生 !A 后放弃整个命令,因为他会看到现在两个循环都由于!A而崩溃。至少我是这么想的还是我在这里想错了?

【问题讨论】:

    标签: while-loop


    【解决方案1】:

    将一个代码块嵌套在另一个代码块中不会改变它们中的任何一个的行为方式。代码仍按逻辑顺序逐句执行。

    对于循环,逻辑顺序是在循环的每次迭代之间评估循环的终止条件。它没有某种观察者或通知系统来检查循环中的每个操作并中断代码的执行。

    例如:

    x = true;
    while (x == true) {
      x = false;
      x = true;
    }
    

    此循环将无限期地继续,因为条件x == true 不会在每一行代码之后进行评估,而是在整个代码块完成并且循环再次迭代之后进行评估。

    在另一个循环中嵌套一个循环不会改变这种行为。

    x = true;
    while (x == true) {
      // do any variety of things, maybe one line of code or
      // maybe a million lines of code, maybe call methods,
      // maybe include loops or if-blocks, doesn't matter
    }
    

    如果一个人会执行如下命令:while A 执行以下操作:while A,执行 Non-A,否则 A,他会放弃整个命令

    他会吗?我不会。不同的人以不同的方式思考。如果说明不明确,结果会有所不同。另一方面,计算机不能容忍模棱两可的指令。他们执行的逻辑完全是确定性的。如果是编译器/解释器/等。会发现指令模棱两可的情况,与人类不同,它不会对此事做出直观的决定。它只会抛出一个错误。

    这并不是说 code 总是明确的。人类编写的代码有很多迟钝且难以理解。或者由可能不了解计算机如何执行该代码的人编写。但是,如果该代码运行,那么它对计算机来说就不会模棱两可了。即使我们人类难以理解代码中会发生什么,计算机仍然会让它发生。

    【讨论】:

      【解决方案2】:

      #2 第二个问题表明人类已经暗示了

      while A 执行以下操作:while A 执行 Non-A,否则执行 A

      计算机可以执行:

      • while A 执行以下操作:( if A ,(while A, do Non-A), else A)

      • while A 执行以下操作:((while A, do Non-A) if A, , else A))

      你提供的伪代码是

      • 而 A 执行以下操作:(((while A, do Non-A) A)

      #1 对于伪代码供应的观察结果是正确的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多