231 lines
21 KiB
HTML
231 lines
21 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>for 循环</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_for skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">for 循环</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>执行一次 <span class="t-spar">初始化语句</span>,然后重复执行 <span class="t-spar">语句</span> 和 <span class="t-spar">迭代表达式</span>,直到 <span class="t-spar">条件</span> 的值变成 false。每次迭代前都进行该检测。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"> <i>正式语法:</i></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">属性</span><span class="t-mark">(可选)</span> <code><b>for (</b></code> <span class="t-spar">初始化语句</span> <span class="t-spar">条件</span><span class="t-mark">(可选)</span> <code><b>;</b></code> <span class="t-spar">迭代表达式</span><span class="t-mark">(可选)</span> <code><b>)</b></code> <span class="t-spar">语句</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"> <i>非正式语法:</i></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">属性</span><span class="t-mark">(可选)</span> <code><b>for (</b></code> <span class="t-spar">声明或表达式</span><span class="t-mark">(可选)</span> <code><b>;</b></code> <span class="t-spar">声明或表达式</span><span class="t-mark">(可选)</span> <code><b>;</b></code> <span class="t-spar">表达式</span><span class="t-mark">(可选)</span> <code><b>)</b></code> <span class="t-spar">语句</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 任意数量的<a href="cpp-language-attributes.html">属性</a></td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">初始化语句</span></td>
|
|
<td>-</td>
|
|
<td>下列之一:
|
|
<ul>
|
|
<li>一条<a href="cpp-language-statements.html">表达式语句</a>(可以是<i>空语句</i>“<code><b>;</b></code>”)</li>
|
|
<li>一条<a href="cpp-language-declarations.html">简单声明</a>,通常是带初始化器的循环计数变量的声明,但它可以声明任意多个变量<span class="t-rev-inl t-since-cxx17"><span>或<a href="cpp-language-structured_binding.html">结构化绑定</a></span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span></li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx23">
|
|
<td>
|
|
<ul>
|
|
<li>一条<a href="cpp-language-type_alias.html">别名声明</a></li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<dl>
|
|
<dd>注意任何 <span class="t-spar">初始化语句</span> 必须以分号 <code><b>;</b></code> 结束,因此它经常被非正式描述为后随分号的表达式或声明。</dd>
|
|
</dl>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">条件</span></td>
|
|
<td>-</td>
|
|
<td>下列之一:
|
|
<ul>
|
|
<li><a href="cpp-language-implicit_conversion.html">可以按语境转换</a>到 bool 的<a href="cpp-language-expressions.html">表达式</a>。在每次重复之前对此表达式求值,且如果它产生 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 则退出循环。</li>
|
|
<li>带有花括号或等号<a href="cpp-language-initialization.html">初始化器</a>的单一变量<a href="cpp-language-declarations.html">声明</a>。初始化器在每次重复之前求值,且如果被声明变量的值转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>,那么退出循环。</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">迭代表达式</span></td>
|
|
<td>-</td>
|
|
<td>任意<a href="cpp-language-expressions.html">表达式</a>,在循环的每次重复之后并在重复求值 <span class="t-spar">条件</span> 之前求值。通常是增加循环计数器的表达式。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">语句</span></td>
|
|
<td>-</td>
|
|
<td>任意<a href="cpp-language-statements.html">语句</a>,通常是复合语句,作为循环体</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>上述语法产生的代码等价于:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>{</b></code><br />
|
|
<dl>
|
|
<dd><span class="t-spar">初始化语句</span><br /></dd>
|
|
<dd><code><b>while (</b></code> <span class="t-spar">条件</span> <code><b>) {</b></code><br />
|
|
<dl>
|
|
<dd><span class="t-spar">语句</span><br /></dd>
|
|
<dd><span class="t-spar">迭代表达式</span> <code><b>;</b></code><br /></dd>
|
|
</dl>
|
|
</dd>
|
|
<dd><code><b>}</b></code></dd>
|
|
</dl>
|
|
<p><code><b>}</b></code></p>
|
|
</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>但有以下不同:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> <span class="t-spar">初始化语句</span> 声明的名字(如果 <span class="t-spar">初始化语句</span> 是声明)和 <span class="t-spar">条件</span> 声明的名字(如果 <span class="t-spar">条件</span> 是声明)处于同一作用域中(也是 <span class="t-spar">语句</span> 的作用域)。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> <span class="t-spar">语句</span> 中的 <a href="cpp-language-continue.html">continue</a> 将执行 <span class="t-spar">迭代表达式</span></div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 空的 <span class="t-spar">条件</span> 等价于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">while</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span></span></span></div>
|
|
<p>如果执行循环时需要在某些点终止,那么可以将 <a href="cpp-language-break.html">break 语句</a>用作终止语句。</p>
|
|
<p>如果执行循环时需要在循环体末尾继续,那么可以将 <a href="cpp-language-continue.html">continue 语句</a>用作捷径。</p>
|
|
<p>与 <a href="cpp-language-while.html">while</a> 循环的情况相同,如果 <span class="t-spar">语句</span> 是单个语句(非复合语句),那么声明于其中的变量的作用域被限制在循环体内,如同一条复合语句。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">for</span> <span class="br0">(</span><span class="sy4">;;</span><span class="br0">)</span>
|
|
<span class="kw4">int</span> n<span class="sy4">;</span>
|
|
<span class="co1">// n 离开作用域</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-for.html"><tt>for</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>作为 C++ <a href="cpp-language-memory_model.html#.E5.90.91.E5.89.8D.E8.BF.9B.E5.B1.95">向前进展保证</a>的一部分,如果没有<a href="cpp-language-as_if.html">可观察行为</a>(不调用 I/O 函数,访问 volatile 对象,或进行原子或同步操作)的循环不会终止,那么它的行为<a href="cpp-language-ub.html">未定义</a>。编译器可以移除这种循环。</p>
|
|
<p>C++ 中,<span class="t-spar">初始化语句</span> 的作用域与 <span class="t-spar">语句</span> 的作用域一致,而在 C 中 <span class="t-spar">语句</span> 的作用域嵌套于 <span class="t-spar">初始化语句</span> 的作用域中:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="sy4">;</span> <span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">long</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// 在 C 中合法,在 C++ 中非法</span>
|
|
<span class="co1">// ...</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <vector></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="co1">// 典型的以单语句作为循环体的循环</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1"><</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> i <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 初始化语句可以声明多个名字,</span>
|
|
<span class="co1">// 只要它们可以使用相同的声明说明符序列</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span>, <span class="sy2">*</span>p <span class="sy1">=</span> <span class="sy3">&</span>i<span class="sy4">;</span> i <span class="sy1"><</span> <span class="nu0">9</span><span class="sy4">;</span> i <span class="sy2">+</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> i <span class="sy1"><<</span> <span class="st0">':'</span> <span class="sy1"><<</span> <span class="sy2">*</span>p <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// (循环)条件可以是声明</span>
|
|
<span class="kw4">char</span> cstr<span class="br0">[</span><span class="br0">]</span> <span class="sy1">=</span> <span class="st0">"Hello"</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="kw4">char</span> c <span class="sy1">=</span> cstr<span class="br0">[</span>n<span class="br0">]</span><span class="sy4">;</span> <span class="sy2">++</span>n<span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> c<span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 初始化语句可以使用 auto 类型说明符</span>
|
|
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> v <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">3</span>, <span class="nu0">1</span>, <span class="nu0">4</span>, <span class="nu0">1</span>, <span class="nu0">5</span>, <span class="nu0">9</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> iter <span class="sy1">=</span> v.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> iter <span class="sy3">!</span><span class="sy1">=</span> v.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="sy2">++</span>iter<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="sy2">*</span>iter <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 初始化语句可以是表达式</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"循环开始<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"循环测试<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"迭代 "</span> <span class="sy1"><<</span> <span class="sy2">++</span>n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="br0">)</span>
|
|
<span class="kw1">if</span><span class="br0">(</span>n <span class="sy1">></span> <span class="nu0">1</span><span class="br0">)</span>
|
|
<span class="kw1">break</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">0 1 2 3 4 5 6 7 8 9
|
|
0:0 2:2 4:4 6:6 8:8
|
|
Hello
|
|
3 1 4 1 5 9
|
|
循环开始
|
|
循环测试
|
|
迭代 1
|
|
循环测试
|
|
迭代 2
|
|
循环测试</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td><a href="cpp-language-range-for.html">范围 <code>for</code> 循环</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>执行范围上的循环</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|