第 3 集 · B1 · 6 分 17 秒

C 语言 · 第3集 · for 和 while 有什么不同

从 Hello World、循环、递归讲到汉诺塔和动态规划,句子短,适合跟读。 开头:尊敬的听众,让我们来谈谈程序的执行流。

C 语言 · 第3集 · for 和 while 有什么不同

中俄字幕

  1. уважаемые слушатели давайте поговорим о потоке исполнения программы

    尊敬的听众,让我们来谈谈程序的执行流。

  2. в нормальных условиях команды в языке си выполняются последовательно строчка за

    在正常情况下,C语言中的指令按顺序逐行执行。

  3. строчкой строчка за строчкой последовательное исполнение

    一行接一行,即顺序执行。

  4. но во многих случаях нам требуется зациклить ряд действий.

    但在许多情况下,我们需要重复执行一系列操作。

  5. Это можно сравнить со стадионом, то есть мы не просто бежим по дорожке, и все время

    这可以类比为体育场跑道:我们并非只沿着跑道跑一次就结束,而是不断循环。

  6. у нас что- то меняется, новые и новые команды, да, а тут вот мы раз и побежали по

    过程中总有一些变化,出现新的指令,对吧?而在这里,我们只需启动一次,就开始绕圈跑。

  7. кругу. Пробежали один круг, переключились на следующий, раз и еще.

    跑完一圈后,切换到下一圈,再跑一圈,如此反复。

  8. однократное выполнение команд, которые зациклены, называется итерация.

    对被循环的指令执行一次,称为一次迭代。

  9. А сама последовательность команд, здесь она взята в фигурные скобки, называется.

    而用花括号括起来的这一系列指令,则被称为……

  10. тело цикла. Ну, раз уж возникло тело цикла, у нас есть и заголовок цикла.

    循环体。既然有了循环体,自然也就有循环头。

  11. Вот он. На самом деле именно заголовок цикла является определяющим, определяющим что

    就是它。实际上,循环的标题才是决定性的,它决定了

  12. фактическое количество итераций.

    实际的迭代次数。

  13. В данном случае это цикл пока, while.

    本例中是 while 循环。

  14. пока это условие является истинным, мы будем входить и входить на очередную

    只要该条件为真,我们就会反复进入下一次迭代。

  15. итерацию. Количество итераций в цикле while заранее неизвестно.

    while 循环中的迭代次数事先无法确定。

  16. Соответственно, может возникнуть такая ситуация, когда у нас это условие соблюдено

    因此,可能出现这种情况:我们的条件始终成立,

  17. всегда, ну как, два плюс два равно четыре.

    比如,2 加 2 等于 4。

  18. А что если у нас переменная i не меняется?

    如果变量 i 不发生变化,会怎样?

  19. Например, мы забудем увеличивать переменную i в процессе выполнения итерации.

    例如,我们在执行迭代过程中忘记增加变量 i 的值。

  20. да все мы зацикливаемся и получаем бесконечно работающую программу.

    那么,我们将陷入死循环,程序将无限运行。

  21. В данном случае.

    在这种情况下。

  22. Вы видите, что у меня будут перебраны и распечатаны все числа от нуля до десяти не

    您可以看到,我将遍历并打印从 0 到 10 的所有数字,但

  23. включительно. То есть 0, 1, 2 и так далее.

    不包括 10。也就是说,0、1、2,依此类推。

  24. Почему не включительно?

    为什么不包括 10?

  25. Потому что у меня это условие сформулировано строго: и меньше десяти.

    因为我的条件是严格设定的:必须小于 10。

  26. Однако, если я распечатаю значение переменной i по выходе из цикла while, то

    然而,如果我在 while 循环结束后打印变量 i 的值,那么

  27. окажется, что на излете последней

    结果会显示,在最后一次

  28. десятой итерации, когда i

    第十次迭代中,当 i

  29. равнялся нулю, это был первый проход вот этого круга, да, первый проход вот этих

    等于 0 时,这是该循环的第一轮执行,对,就是这两条命令的第一轮执行。

  30. двух команд. да, то есть i равнялся нулю первый проход, i равнялось двум,

    对,也就是说,第一次执行时 i 等于 0,第二次执行时 i 等于 2,

  31. о, прошу прощения, i равнялось одному второй проход, двум третий проход, когда i

    哦,抱歉,i 等于 1 是第二次循环,等于 2 是第三次循环,当 i

  32. равнялся девяти, мы еще вошли на десятую итерацию.

    等于 9 时,我们又进入了第十次迭代。

  33. Мы распечатали девятку, да, и увеличили i на единичку, то есть он становится равным

    我们打印出了 9,对吧?然后将 i 加 1,即它变为

  34. десяти. Понятно?

    10。明白了吗?

  35. То есть выполнив вот это вот 10 раз, я получаю числа от нуля до девяти на экране

    也就是说,执行这 10 次后,屏幕上会显示从 0 到 9(含)的数字。

  36. включительно, а i равняется 10.

    包括 9,而此时 i 等于 10。

  37. Очень интересно то, что в языке Си цикл for— это так называемый синтаксический

    非常有趣的一点是,在 C 语言中,for 循环是一种所谓的语法糖。

  38. сахар. цикл for классический не нужен языку C для своей полноты.

    经典的 for 循环对于 C 语言的完备性而言并非必需。

  39. Но он тем не менее красив и понятен.

    但它依然简洁且易懂。

  40. Он выглядит похоже на то, как его пишут в том же Паскале, например, или в каких- то

    它的写法与 Pascal 等其他语言中的写法类似。

  41. других языках.

    其他语言。

  42. Что мы видим? Вот i равняется нулю, i меньше 10, i++.

    我们看到了什么?这里是 i 等于 0,i 小于 10,i 自增。

  43. Но обратите внимание, вот между этими точками с запятыми, кстати, это несколько

    但请注意,分号之间的这部分——顺便说一下,这有点儿

  44. странно, точки с запятыми находятся внутри круглых скобок заголовка цикл for.

    奇怪:分号位于 for 循环标题的圆括号内部。

  45. Это синтаксически обязательные точки с запятыми, их в цикле for не быть не может.

    这些是语法上必需的分号,在 for 循环中不可或缺。

  46. А вот этих частей может и не быть на самом деле.

    而这些部分实际上可以不存在。

  47. Самый простой цикл for, он не содержит ничего ни тут, ни тут, и ни тут.

    最简单的 for 循环在这三处均为空。

  48. Как называются вот эти вот части?

    这些部分分别叫什么?

  49. Вот эта часть заголовка цикла for называется инициализация.

    for 循环标题中的这一部分称为初始化。

  50. Она фактически.

    它实际上是。

  51. Вот эта вот часть соответствует ровно тому, что пишется в цикле while вот в этом

    这部分正好对应 while 循环中此处所写的代码。

  52. самом месте. понятно раз

    明白了吗?

  53. вот это это условие вхождения на каждую очередную итерацию то есть ровно то что

    这是每次进入下一轮迭代的条件,也就是

  54. пишется в цикле while вот тут

    while 循环中这里所写的条件。

  55. И инкрементация, то есть способ перехода с одной итерации на другую, что нам нужно

    还有增量操作,即从一次迭代过渡到另一次迭代的方式,这是我们所需要的

  56. сделать после того, как будет выполнено тело цикла.

    在循环体执行完毕后进行。

  57. То есть фактически вот это действие присоединяется

    也就是说,实际上这个操作会附加到每次迭代上,且必须执行。

  58. к каждой итерации и обязательно выполняется.

    也就是说,实际上这个操作会附加到每次迭代上,且必须执行。

  59. Понятна логика, да?

    逻辑清楚,对吧?

  60. То есть цикл for является полным аналогом цикла while, но немножко более сокращенная

    也就是说,for循环与while循环完全等效,但写法更简洁一些。

  61. форма. Сокращенная в чем?

    表单。在哪些方面进行了简化?

  62. Меньше количество строк, более компактно по вертикали, да, и привычно.

    行数更少,垂直方向更紧凑,是的,而且更符合习惯。

  63. Обратите внимание, цикл for в языке Си также, как и цикл while, может бесконечно

    请注意,C语言中的for循环和while循环一样,也可能陷入无限循环。

  64. зациклиться. Я приведу один конкретный пример, когда это может произойти.

    我举一个可能发生这种情况的具体例子。

  65. Посмотрите, я положу в i.

    看,我将i设为10。

  66. десятку. Я напишу здесь i больше либо равно нуля.

    我在这里写i大于等于0。

  67. а здесь напишу минус минус i.

    而这里我写--i。

  68. что у меня получается?

    结果会怎样?

  69. У меня получается, что i пробегает значения от 10

    结果是,i的取值范围是从10

  70. до 0 включительно.

    到0(包含0)。

  71. правильно? все прекрасно.

    对吗?一切都很好。

  72. да, и по итогам этого цикла это условие должно оказаться нарушенным, то есть, ну,

    是的,经过这个循环后,该条件将被违反,也就是说,嗯,

  73. что я должен достигнуть отрицательного значения, да?

    我需要达到一个负值,对吗?

  74. Однако представим себе, что у меня i является беззнаковой переменной.

    然而,假设我的变量 i 是无符号类型。

  75. Что в этом случае происходит?

    此时会发生什么?

  76. Ну это условие у меня будет истинным просто всегда.

    那么,该条件将始终为真。

  77. Понимаете? Ну что ж, на этом все.

    明白了吗?好了,本次讲解到此结束。

  78. Переходите к следующему видео, будем использовать циклы для генерации прогрессий.

    请进入下一个视频,我们将使用循环来生成数列。

来源:Тимофей Хирьянов · CC BY 3.0

同系列