128 lines
12 KiB
HTML
128 lines
12 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>while 循环</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_while skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">while 循环</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-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>。每次重复之前都进行检测。</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"><span class="t-spar">属性</span><span class="t-mark">(可选)</span> <code><b>while (</b></code> <span class="t-spar">条件</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>能<a href="cpp-language-implicit_cast.html" class="mw-redirect">按语境转换为</a> bool 的任意<a href="cpp-language-expressions.html">表达式</a>,或带花括号或等号<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> 时退出循环。如果条件同时是声明,那么每次重复之前求值其初始化器,且在被声明变量的值转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></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>无论 <span class="t-spar">语句</span> 是否为复合语句,它始终都会引入一个<a href="cpp-language-scope.html">块作用域</a>。换言之在其中声明的变量仅在循环体内可见。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">while</span> <span class="br0">(</span><span class="sy2">--</span>x <span class="sy1">>=</span> <span class="nu0">0</span><span class="br0">)</span>
|
|
<span class="kw4">int</span> i<span class="sy4">;</span>
|
|
<span class="co1">// i 离开作用域</span></pre></div>
|
|
</div>
|
|
<p>与下面的相同</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">while</span> <span class="br0">(</span><span class="sy2">--</span>x <span class="sy1">>=</span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">int</span> i<span class="sy4">;</span>
|
|
<span class="br0">}</span> <span class="co1">// i 离开作用域</span></pre></div>
|
|
</div>
|
|
<p>如果 <span class="t-spar">条件</span> 是像 <span class="t-c"><span class="mw-geshi cpp source-cpp">T t <span class="sy1">=</span> x</span></span> 这样的声明,那么被声明的变量仅在循环体内处于作用域中,而且在每次重复中销毁并重新创建,换言之,这种 while 循环等价于:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1">label<span class="sy4">:</span>
|
|
<span class="br0">{</span> <span class="co1">// 循环作用域的开始</span>
|
|
T t <span class="sy1">=</span> x<span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span>t<span class="br0">)</span> <span class="br0">{</span>
|
|
语句
|
|
<span class="kw1">goto</span> label<span class="sy4">;</span> <span class="co1">// 调用 t 的析构函数</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>如果循环的执行必须在某点终止,那么可以使用 <a href="cpp-language-break.html">break 语句</a>作为终止语句。</p>
|
|
<p>如果循环需要在循环体结尾继续,那么可以使用 <a href="cpp-language-continue.html">continue 语句</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>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-while.html"><tt>while</tt></a></p>
|
|
<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="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="co1">// 带单语句的 while 循环</span>
|
|
<span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<span class="kw1">while</span> <span class="br0">(</span>i <span class="sy1"><</span> <span class="nu0">10</span><span class="br0">)</span>
|
|
i<span class="sy2">++</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> i <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 带复合语句的 while 循环</span>
|
|
<span class="kw4">int</span> j <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
|
|
<span class="kw1">while</span> <span class="br0">(</span>j <span class="sy1"><</span> <span class="nu0">9</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> j <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
j <span class="sy2">+</span><span class="sy1">=</span> <span class="nu0">2</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">// 带声明条件的 while 循环</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="kw4">int</span> k <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
|
|
<span class="kw1">while</span> <span class="br0">(</span><span class="kw4">char</span> c <span class="sy1">=</span> cstr<span class="br0">[</span>k<span class="sy2">++</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> 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="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">10
|
|
2 4 6 8
|
|
Hello</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|