import{_ as a,c as e,o as t,a4 as s}from"./chunks/framework.Cy9JvDAg.js";const m=JSON.parse('{"title":"3.3.5 - for语句","description":"","frontmatter":{"title":"3.3.5 - for语句","footer":true,"lastUpdated":true,"outline":"deep"},"headers":[],"relativePath":"3.3.5.md","filePath":"3.3.5.md"}'),o={name:"3.3.5.md"},n=s(`<h3 id="_3-3-5-for语句" tabindex="-1">3.3.5 - for语句 <a class="header-anchor" href="#_3-3-5-for语句" aria-label="Permalink to &quot;3.3.5 - for语句&quot;">​</a></h3><p><strong>for</strong>语句有两种形式：数字形式和通用形式。</p><hr><h4 id="数字形式的for语句" tabindex="-1">数字形式的<strong>for</strong>语句 <a class="header-anchor" href="#数字形式的for语句" aria-label="Permalink to &quot;数字形式的**for**语句 {#数字形式的for语句}&quot;">​</a></h4><p>数字形式的<strong>for</strong>语句是以一个控制变量遍历算术过程来循环重复一个代码块。其有以下语法：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end</span></span></code></pre></div><p>给出的标识符（名称）定义了控制变量，其为循环体（语法块）中一个新的局部变量。</p><p>循环首先计算一次三个控制表达式的值。这些值分别被称作<strong>初始化变量</strong>、<strong>界限</strong>以及<strong>步长</strong>。如果步长被省略了，其默认值为1。</p><p>如果初始化变量和步长都是整数，那么循环是由整数结束的；要注意界限可以不是整数。否则，三个值会被转换为浮点数且循环由浮点数结束。这种情况下要注意浮点精度的问题。</p><p>在初始化完成后，循环体会通过控制变量的遍历算术过程来重复，其由初始值为始，由给出的步长计算差值。负数的步长会产生一个递减的序列；步长等于零时会抛出异常。循环一直持续到值小于等于（对于正数步长则是大于等于）界限值为止。如果初始值已经小于（或者大于，当步长为正数）界限值时，循环体不会被执行。</p><p>对于整数循环，控制变量永远不会回绕；反之，溢出会结束循环。</p><p>你不应当在循环期间改变控制变量的值。如果你在循环之后还需要这个值，你可以在退出循环前将其赋值给另一个变量。</p><h4 id="通用形式的for语句-通用形式的for语句" tabindex="-1">通用形式的<strong>for</strong>语句 {#通用形式的<strong>for</strong>语句} <a class="header-anchor" href="#通用形式的for语句-通用形式的for语句" aria-label="Permalink to &quot;通用形式的**for**语句 {#通用形式的**for**语句}&quot;">​</a></h4><p>通用形式的<strong>for</strong>语句通过一个被称为<em>迭代器</em>的方法来工作。在每个迭代器中，其迭代方法被调用以产生一个新的值，当这个新值为<strong>nil</strong>时循环结束。通用形式的**for*循环有以下语法：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>stat ::= for namelist in explist do block end</span></span>
<span class="line"><span>namelist ::= Name {‘,’ Name}</span></span></code></pre></div><p>一条<strong>for</strong>语句就像这样：</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>for var_1, ···, var_n in explist do body end</span></span></code></pre></div><p>var_i被声明为循环体的局部变量。其中的第一个变量就是<em>控制变量</em>。</p><p>循环首先计算explist以生成四个值：<em>迭代器方法</em>、<em>状态</em>、控制结构的<em>初始化变量</em>以及<em>关闭值</em>。</p><p>然后每次迭代时，Lua会分别将状态和控制变量作为两个参数来调用迭代方法。调用结果在之后被复制到循环变量中，流程遵循多重赋值的规则（参见<a href="/lua5.4-manual-zh/3.3.3.html">3.3.3</a>）。控制变量变为<strong>nil</strong>时，循环终止。否则，将执行循环体并循环到下次迭代。</p><p>关闭值的行为和待关闭变量（参见<a href="/lua5.4-manual-zh/3.3.8.html">3.3.8</a>）相似，可以用于循环结束时释放资源。否则它不会影响循环。</p><p>你不应当在循环期间改变控制变量的值。</p>`,22),r=[n];function p(i,l,d,c,h,g){return t(),e("div",null,r)}const _=a(o,[["render",p]]);export{m as __pageData,_ as default};
