-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcpp-statement.html
367 lines (367 loc) · 105 KB
/
cpp-statement.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=2"><meta name="theme-color" content="#222"><meta http-equiv="X-UA-COMPATIBLE" content="IE=edge,chrome=1"><meta name="renderer" content="webkit"><link rel="icon" type="image/ico" sizes="32x32" href="/assets/favicon.ico"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png"><link rel="alternate" href="/rss.xml" title="Jiankychen's Blog" type="application/rss+xml"><link rel="alternate" href="/atom.xml" title="Jiankychen's Blog" type="application/atom+xml"><link rel="alternate" type="application/json" title="Jiankychen's Blog" href="https://jiankychen.github.io/feed.json"><link rel="preconnect" href="https://lf9-cdn-tos.bytecdntp.com"><link rel="preconnect" href="https://at.alicdn.com"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Mulish:400,400italic,700,700italic%7CFredericka%20the%20Great:400,400italic,700,700italic%7CNoto%20Serif%20JP:400,400italic,700,700italic%7CNoto%20Serif%20SC:400,400italic,700,700italic%7CInconsolata:400,400italic,700,700italic&display=swap&subset=latin,latin-ext" media="none" onload="this.media='all'"><link rel="stylesheet" href="/css/app.css?v=0.4.2"><link rel="modulepreload" href="/js/chunk-7IVLRIQ3.js"><link rel="modulepreload" href="/js/chunk-IXT6LZJL.js"><link rel="modulepreload" href="/js/chunk-PHSEV26P.js"><link rel="modulepreload" href="/js/chunk-XHQGHZCW.js"><link rel="modulepreload" href="/js/comments-TUWNDU5I.js"><link rel="modulepreload" href="/js/post-P6IN2S3Y.js"><link rel="modulepreload" href="/js/quicklink-HAJEHOPK.js"><link rel="modulepreload" href="/js/search-WFXK2K66.js"><link rel="modulepreload" href="/js/siteInit.js"><link rel="stylesheet" href="https://npm.webcache.cn/@waline/[email protected]/dist/waline.css" media="none" onload="this.media='all'"><link rel="preload" href="https://i.imgtg.com/2023/03/09/Y0hOs.jpg" as="image" fetchpriority="high"><link rel="preload" href="https://i.imgtg.com/2023/03/09/YSIlc.jpg" as="image" fetchpriority="high"><link rel="preload" href="https://i.imgtg.com/2023/03/09/YS2LU.jpg" as="image" fetchpriority="high"><link rel="preload" href="https://i.imgtg.com/2023/03/09/YSj7p.jpg" as="image" fetchpriority="high"><link rel="preload" href="https://img.timelessq.com/images/2022/07/26/99fb5ff897a82984470abf5e2a235d94.jpg" as="image" fetchpriority="high"><link rel="preload" href="https://img.timelessq.com/images/2022/07/26/42bab566f107b9a16542343e0368fb77.jpg" as="image" fetchpriority="high"><link rel="canonical" href="https://jiankychen.github.io/cpp-statement"><title>C++ 语句</title><meta name="generator" content="Hexo 7.0.0"></head><body itemscope="" itemtype="http://schema.org/WebPage"><div id="loading"><div class="cat"><div class="body"></div><div class="head"><div class="face"></div></div><div class="foot"><div class="tummy-end"></div><div class="bottom"></div><div class="legs left"></div><div class="legs right"></div></div><div class="paw"><div class="hands left"></div><div class="hands right"></div></div></div></div><div id="container"><header id="header" itemscope="" itemtype="http://schema.org/WPHeader"><div class="inner"><div id="brand"><div class="pjax"><h1 itemprop="name headline">C++ 语句</h1><div class="meta"><span class="item" title="创建时间:2022-09-12 10:23:26"><span class="icon"><i class="ic i-calendar"></i></span><span class="text">发表于</span><time itemprop="dateCreated datePublished" datetime="2022-09-12T10:23:26+08:00">2022-09-12</time></span><span class="item" title="本文字数"><span class="icon"><i class="ic i-pen"></i></span><span class="text">本文字数</span><span>19k</span><span class="text">字</span></span><span class="item" title="阅读时长"><span class="icon"><i class="ic i-clock"></i></span><span class="text">阅读时长</span><span>17 分钟</span></span></div></div></div><nav id="nav"><div class="inner"><div class="toggle"><div class="lines" aria-label="切换导航栏"><span class="line"></span><span class="line"></span><span class="line"></span></div></div><ul class="menu"><li class="item title"><a href="/" rel="start">Jiankychen</a></li></ul><ul class="right" id="rightNav"><li class="item theme"><i class="ic i-sun"></i></li><li class="item search"><i class="ic i-search"></i></li></ul></div></nav></div><div class="pjax" id="imgs"><ul><li class="item" style="background-image: url("https://i.imgtg.com/2023/03/09/Y0hOs.jpg");"></li><li class="item" style="background-image: url("https://i.imgtg.com/2023/03/09/YSIlc.jpg");"></li><li class="item" style="background-image: url("https://i.imgtg.com/2023/03/09/YS2LU.jpg");"></li><li class="item" style="background-image: url("https://i.imgtg.com/2023/03/09/YSj7p.jpg");"></li><li class="item" style="background-image: url("https://img.timelessq.com/images/2022/07/26/99fb5ff897a82984470abf5e2a235d94.jpg");"></li><li class="item" style="background-image: url("https://img.timelessq.com/images/2022/07/26/42bab566f107b9a16542343e0368fb77.jpg");"></li></ul></div></header><div id="waves"><svg class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"><defs><path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z"></path></defs><g class="parallax"><use xlink:href="#gentle-wave" x="48" y="0"></use><use xlink:href="#gentle-wave" x="48" y="3"></use><use xlink:href="#gentle-wave" x="48" y="5"></use><use xlink:href="#gentle-wave" x="48" y="7"></use></g></svg></div><main><div class="inner"><div class="pjax" id="main"><div class="article wrap"><div class="breadcrumb" itemlistelement="" itemscope="" itemtype="https://schema.org/BreadcrumbList"><i class="ic i-home"></i><span><a href="/">首页</a></span><i class="ic i-angle-right"></i><span class="current" itemprop="itemListElement" itemscope="itemscope" itemtype="https://schema.org/ListItem"><a href="/categories/C/" itemprop="item" rel="index" title="分类于C++"><span itemprop="name">C++<meta itemprop="position" content="0"></span></a></span></div><article class="post block" itemscope="itemscope" itemtype="http://schema.org/Article" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://jiankychen.github.io/cpp-statement.html"><span hidden="hidden" itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"><meta itemprop="image" content="/assets/avatar.jpg"><meta itemprop="name" content="Jiankychen"><meta itemprop="description" content="Never put off till tomorrow what you can do today, "></span><span hidden="hidden" itemprop="publisher" itemscope="itemscope" itemtype="http://schema.org/Organization"><meta itemprop="name" content="Jiankychen's Blog"></span><div class="body md" itemprop="articleBody"><h1 id="语句与语句作用域"><a class="anchor" href="#语句与语句作用域">#</a> 语句与语句作用域</h1>
<h2 id="简单语句"><a class="anchor" href="#简单语句">#</a> 简单语句</h2>
<p>表达式语句(expression statement):执行表达式并丢弃掉求值结果</p>
<p>空语句(null statement):空语句中只含有一个单独的分号</p>
<p>例如:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 重复读入数据直至到达文件末尾或某次输入的值等于 sought</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> s <span class="token operator">&&</span> s <span class="token operator">!=</span> sought<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token punctuation">;</span> <span class="token comment">// 空语句</span></pre></td></tr></tbody></table></figure><blockquote>
<p>使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的</p>
</blockquote>
<p><strong>别漏写分号,也别多写分号</strong>:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>ival <span class="token operator">=</span> v1 <span class="token operator">+</span> v2<span class="token punctuation">;</span><span class="token punctuation">;</span> <span class="token comment">// 正确:第二个分号表示一条多余的空语句</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>iter <span class="token operator">!=</span> svec<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//while 循环体是那条空语句(无休止循环)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token operator">++</span>iter<span class="token punctuation">;</span> <span class="token comment">// 递增运算不输于循环的一部分</span></pre></td></tr></tbody></table></figure><p><strong>复合语句</strong>(compound statement)是指用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称作 <strong>块</strong>(block)</p>
<p>一个块就是一个作用域,在块中引入的名字只能在块内部以及嵌套在块中的子块里访问</p>
<blockquote>
<p><strong>块不以分号作为结束</strong></p>
</blockquote>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>val <span class="token operator"><=</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> sum <span class="token operator">+=</span> val<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token operator">++</span>val<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>空块:是指内部没有任何语句的一对花括号。空块的作用等价于空语句</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> s <span class="token operator">&&</span> s <span class="token operator">!=</span> sought<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">// 空块</span></pre></td></tr></tbody></table></figure><h2 id="语句作用域"><a class="anchor" href="#语句作用域">#</a> 语句作用域</h2>
<p>可以在 if 、switch 、while 和 for 语句的控制结构内定义变量。但是需要注意,定义在控制结构中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token function">get_num</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// 每次迭代时创建并初始化 i</span></pre></td></tr><tr><td data-num="2"></td><td><pre> cout <span class="token operator"><<</span> i <span class="token operator"><<</span> endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">// 错误:在循环外部无法访问 i</span></pre></td></tr></tbody></table></figure><p>如果其他代码也需要访问控制变量,则变量必须定义在语句的外部</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 寻找第一个负值元素</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">auto</span> beg <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 注意要初始化</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>beg <span class="token operator">!=</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token operator">*</span>beg <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token operator">++</span>beg<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>beg <span class="token operator">==</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token comment">// 此时我们知道 v 中的所有元素都大于等于 0</span></pre></td></tr></tbody></table></figure><h1 id="条件语句"><a class="anchor" href="#条件语句">#</a> 条件语句</h1>
<p>C++ 语言提供了两种按条件执行的语句</p>
<ul>
<li>if 语句:根据条件决定控制流</li>
<li>switch 语句:计算一个整型表达式的值,然后根据这个值从几条执行路径中选择一条</li>
</ul>
<h2 id="if-语句"><a class="anchor" href="#if-语句">#</a> if 语句</h2>
<p>简单 if 语句的语法形式:</p>
<pre><code>if (condition)
statement
</code></pre>
<p>if else 语句的形式:</p>
<pre><code>if (condition)
statement
else
statement2
</code></pre>
<p>如果 condition 为真,执行 statement 。当 statement 执行完成后,程序继续执行 if 语句后面的其他语句</p>
<p>如果 condition 为假,跳过 statement 。对于简单 if 语句来说,程序继续执行 if 语句后面的其他语句;对于 if else 语句来说,执行 statement2</p>
<p>注意:在这两个版本的 if 语句中,condition 都必须用圆括号包围起来</p>
<blockquote>
<p>condition 可以是一个表达式,也可以是一个初始化了的变量声明。不管是表达式还是变量,其类型都必须能转换成布尔类型</p>
</blockquote>
<h3 id="嵌套-if-语句"><a class="anchor" href="#嵌套-if-语句">#</a> 嵌套 if 语句</h3>
<p>例如:把数字形式表示的成绩转换成字母形式,并在合格的成绩后面添加一个加号或减号(如果成绩的末位是 8 或者 9 ,添加一个加号;如果末位是 0 、1 或 2 ,添加一个减号)</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>vector<span class="token operator"><</span>string<span class="token operator">></span> scores <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"F"</span><span class="token punctuation">,</span> <span class="token string">"D"</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> <span class="token string">"A"</span><span class="token punctuation">,</span> <span class="token string">"A++"</span><span class="token punctuation">}</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>string lettergrade<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator"><</span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token comment">// 成绩不合格,对应的字母是 F</span></pre></td></tr><tr><td data-num="4"></td><td><pre> lettergrade <span class="token operator">=</span> scores<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">else</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="6"></td><td><pre> lettergrade <span class="token operator">=</span> scores<span class="token punctuation">[</span><span class="token punctuation">(</span>grade <span class="token operator">-</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 获得字母形式的成绩</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator">!=</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token comment">// 只要不是 A++(100 分),就考虑添加加号或者减号</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator">%</span> <span class="token number">10</span> <span class="token operator">></span> <span class="token number">7</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> lettergrade <span class="token operator">+=</span> <span class="token char">'+'</span><span class="token punctuation">;</span> <span class="token comment">// 末尾是 8 或者 9 的成绩添加一个加号</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator">%</span> <span class="token number">10</span> <span class="token operator"><</span> <span class="token number">3</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="11"></td><td><pre> lettergrade <span class="token operator">+=</span> <span class="token char">'-'</span><span class="token punctuation">;</span> <span class="token comment">// 末尾是 0 、1 或者 2 的成绩添加一个减号</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><blockquote>
<p>注意使用花括号</p>
</blockquote>
<h3 id="悬垂-else"><a class="anchor" href="#悬垂-else">#</a> 悬垂 else</h3>
<p>当一个 if 语句嵌套在另一个 if 语句内部时,很可能 if 分支会多于 else 分支。此时,我们怎么知道某个给定的 else 是和哪个 if 匹配呢?</p>
<p>这个问题通常称作 <strong>悬垂 else</strong>(dangling else)</p>
<p>C++ 规定 else 与离它最近的尚未匹配的 if 匹配</p>
<blockquote>
<p>In C++, the ambiguity is resolved by specifying that each <code>else</code> is matched with the closest preceding unmatched <code>if</code> .</p>
</blockquote>
<h3 id="使用花括号控制执行路径"><a class="anchor" href="#使用花括号控制执行路径">#</a> 使用花括号控制执行路径</h3>
<p>要想使 else 分支和外层的 if 语句匹配起来,可以在内层 if 语句的两端加上花括号,使其成为一个块</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 末位是 8 或者 9 的成绩添加一个加号;如果末位是 0 、1 或 2 的成绩添加一个减号</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator">%</span> <span class="token number">10</span> <span class="token operator">>=</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>grade <span class="token operator">%</span> <span class="token number">10</span> <span class="token operator">></span> <span class="token number">7</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> lettergrade <span class="token operator">+=</span> <span class="token char">'+'</span><span class="token punctuation">;</span> <span class="token comment">// 末尾是 8 或者 9 的成绩添加一个加号</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token comment">// 花括号强迫 else 与外层 if 匹配</span></pre></td></tr><tr><td data-num="6"></td><td><pre> lettergrade <span class="token operator">+=</span> <span class="token char">'-'</span><span class="token punctuation">;</span> <span class="token comment">// 末位是 0 、1 或 2 的成绩添加一个减号</span></pre></td></tr></tbody></table></figure><h2 id="switch-语句"><a class="anchor" href="#switch-语句">#</a> switch 语句</h2>
<p>switch 语句(switch statement)提供了一条便利的途径使得我们能够在若干固定选项中做出选择</p>
<p>例如,利用 switch 语句统计五个元音字母在文本中出现的次数</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 为每个元音字母初始化其计数值</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">unsigned</span> aCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> eCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> iCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> oCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> uCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">char</span> ch<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token comment">// 如果 ch 是元音字母,将其对应的计数值加 1</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">switch</span> <span class="token punctuation">(</span>ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'a'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token operator">++</span>aCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'e'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token operator">++</span>eCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'i'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token operator">++</span>iCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'o'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token operator">++</span>oCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="19"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'u'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token operator">++</span>uCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="21"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="22"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="24"></td><td><pre><span class="token comment">// 打印结果</span></pre></td></tr><tr><td data-num="25"></td><td><pre>cout <span class="token operator"><<</span> <span class="token string">"Number of vowel a: \t"</span> <span class="token operator"><<</span> aCnt <span class="token operator"><<</span> <span class="token char">'\n'</span></pre></td></tr><tr><td data-num="26"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"Number of vowel e: \t"</span> <span class="token operator"><<</span> eCnt <span class="token operator"><<</span> <span class="token char">'\n'</span></pre></td></tr><tr><td data-num="27"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"Number of vowel i: \t"</span> <span class="token operator"><<</span> iCnt <span class="token operator"><<</span> <span class="token char">'\n'</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"Number of vowel o: \t"</span> <span class="token operator"><<</span> oCnt <span class="token operator"><<</span> <span class="token char">'\n'</span></pre></td></tr><tr><td data-num="29"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"Number of vowel u: \t"</span> <span class="token operator"><<</span> uCnt <span class="token operator"><<</span> endl<span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><p>switch 语句首先对括号里的表达式求值,该表达式(可以是一个初始化的变量声明)紧跟在关键字 switch 的后面。表达式的值转换成整数类型,然后与每个 case 标签的值比较</p>
<p>如果表达式和某个 case 标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达了 switch 的结尾或者是遇到一条 break 语句为止</p>
<blockquote>
<p>break 语句的作用是中断当前的控制流。此例中,break 语句将控制权转移到 switch 语句外面</p>
</blockquote>
<p>如果 switch 语句的表达式和所有 case 都没有匹配上,将直接跳转到 switch 结构之后的第一条语句</p>
<p>case 关键字和它对应的值一起被称为 <strong>case 标签</strong>(case label)</p>
<p>case 标签必须是整型常量表达式</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">char</span> ch <span class="token operator">=</span> <span class="token function">getVal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> ival <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">switch</span><span class="token punctuation">(</span>ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">case</span> <span class="token number">3.14</span><span class="token operator">:</span> <span class="token comment">// 错误:case 标签不是一个整数</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">case</span> ival<span class="token operator">:</span> <span class="token comment">// 错误:case 标签不是一个常量</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token comment">// ...</span></pre></td></tr></tbody></table></figure><blockquote>
<p>任何两个 case 标签的值不能相同,否则就会引发错误</p>
</blockquote>
<p>default 也是一种特殊的 case 标签</p>
<h3 id="switch-内部的控制流"><a class="anchor" href="#switch-内部的控制流">#</a> switch 内部的控制流</h3>
<p>如果某个 case 标签匹配成功,将从该标签开始往后顺序执行所有 case 分支,除非程序显式地中断了这一过程,否则,执行到 switch 的结尾处才会停下来</p>
<p>要想避免执行后续 case 分支的代码,我们必须显式地告诉编译器终止执行过程。大多数情况下,在下一个 case 标签之前应该有一条 break 语句</p>
<p>然而,由于每个 case 标签只能对应一个值,有时候我们希望两个或更多个值共享同一组操作。此时,我们就故意省略掉 break 语句,使得程序能够连续执行若干个 case 标签</p>
<p>例如:统计所有元音字母出现的总次数</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">unsigned</span> vowelCnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">// ...</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">switch</span> <span class="token punctuation">(</span>ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'a'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'e'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'i'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'o'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'u'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator">++</span>vowelCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>C++ 程序的形式比较自由,所以 case 标签之后不一定非得换行。把几个 case 标签写在一行里,强调这些 case 代表的是某个范围内的值</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">switch</span> <span class="token punctuation">(</span>ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token comment">// 另一种合法的书写形式</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'a'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'e'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'i'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'o'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'u'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token operator">++</span>vowelCnt<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><blockquote>
<p>一般不要省略 case 分支最后的 break 语句。如果没写 break 语句,最好加一段注释说清楚程序的逻辑</p>
</blockquote>
<blockquote>
<p>尽管 switch 语句不是非得在最后一个标签后面写上 break ,但是为了安全起见,最好这么做。因为这样的话,即使以后再增加新的 case 分支,也不用再在前面补充 break 语句了</p>
</blockquote>
<h3 id="default-标签"><a class="anchor" href="#default-标签">#</a> default 标签</h3>
<p>如果没有任何一个 case 标签能匹配上 switch 表达式的值,程序将执行紧跟在 <strong>default 标签</strong>(default label)后面的语句</p>
<p>例如,可以增加一个计数值来统计非元音字母的数量</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">switch</span> <span class="token punctuation">(</span>ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'a'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'e'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'i'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'o'</span><span class="token operator">:</span> <span class="token keyword">case</span> <span class="token char">'u'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token operator">++</span>vowelCnt<span class="token punctuation">;</span> <span class="token comment">// 元音字母的数量</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">default</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token operator">++</span>otherCnt<span class="token punctuation">;</span> <span class="token comment">// 非元音字母的数量</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><blockquote>
<p>即使不准备在 default 标签下做任何工作,定义一个 default 标签也是有用的。其目的在于告诉程序的读者,我们已经考虑到了默认的情况,只是目前什么也没做</p>
</blockquote>
<p>标签不应该孤零零地出现,它后面必须跟一条语句或者另外一个 case 标签。如果 switch 结构以一个空的 default 标签作为结束,则该 default 标签后面必须跟一条空语句或一个空块</p>
<h1 id="迭代语句"><a class="anchor" href="#迭代语句">#</a> 迭代语句</h1>
<p>迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来</p>
<ul>
<li>while 和 for 语句在执行循环体之前检查条件</li>
<li>do while 语句先执行循环体,然后再检查条件</li>
</ul>
<h2 id="while-语句"><a class="anchor" href="#while-语句">#</a> while 语句</h2>
<p>只要条件为真,while 语句(while statement)就重复地执行循环体</p>
<p>语法形式为:</p>
<pre><code>while (condition)
statement
</code></pre>
<p>condition 不能为空,如果 condition 第一次求值就得 false , statement 一次都不执行</p>
<p>condition 可以是一个表达式或者是一个带初始化的变量声明</p>
<p><strong>定义在 while 条件部分或者 while 循环体内的变量,每次迭代都经历从创建到销毁的过程</strong></p>
<p>当不确定到底要迭代多少次时,使用 while 循环比较合适</p>
<p>例如:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> v<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> i<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">// 重复读入数据,直至到达文件末尾或者遇到其他输入问题</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> i<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="5"></td><td><pre> v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment">// 寻找第一个负值元素</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token keyword">auto</span> beg <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>beg <span class="token operator">!=</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token operator">*</span>beg <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator">++</span>beg<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>beg <span class="token operator">==</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token comment">// 此时我们知道 v 中的所有元素都大于等于 0</span></pre></td></tr></tbody></table></figure><h2 id="传统的-for-语句"><a class="anchor" href="#传统的-for-语句">#</a> 传统的 for 语句</h2>
<p>for 语句的语法形式:</p>
<pre><code>for (init-statement; condition; expression)
statement
</code></pre>
<p>关键字 for 及括号里的部分称为 for 语句头</p>
<p>init-statement 必须是以下三种形式中的一种:声明语句、表达式语句或者空语句。因为这些语句都以分号作为结束,for 语句的语法形式也可以看作:</p>
<pre><code>for (initializer; condition; expression)
statement
</code></pre>
<p>其中:</p>
<ul>
<li>init-statement 负责初始化一个值,这个值将随着循环的进行而改变</li>
<li>condition 作为循环控制的条件,只要 condition 为真,就执行一次 statement 。如果 condition 第一次的求值结果就是 false ,则 statement 一次也不会执行</li>
<li>expression 负责在每次循环迭代之后修改 init-statement 初始化的变量,这个变量正好就是 condition 检查的对象</li>
<li>statement 可以是一条单独的语句也可以是一条复合语句</li>
</ul>
<blockquote>
<p>for 语句头中定义的对象只在 for 循环体内可见</p>
</blockquote>
<h3 id="for-语句头中的多重定义"><a class="anchor" href="#for-语句头中的多重定义">#</a> for 语句头中的多重定义</h3>
<p>init-statement 可以定义多个对象,但只能有一条声明语句,因此,所有变量的基础类型必须相同</p>
<p>例如:下列代码在 init-statement 里同时定义了索引 i 和循环控制变量 sz</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 记录下 v 的大小,当到达原来的最后一个元素后结束循环</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">decltype</span><span class="token punctuation">(</span>v<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> sz <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">!=</span> sz<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="3"></td><td><pre> v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>v<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><h3 id="省略-for-语句头的某些部分"><a class="anchor" href="#省略-for-语句头的某些部分">#</a> 省略 for 语句头的某些部分</h3>
<p>for 语句头能省略掉 init-statement 、condition 和 expression 中的任何一个(或者全部)</p>
<p>如果无须初始化,则我们可以使用一条空语句作为 init-statement ,例如</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">auto</span> beg <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token comment">/* 空语句 */</span><span class="token punctuation">;</span> beg <span class="token operator">!=</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token operator">*</span>beg <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token operator">++</span>beg<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token punctuation">;</span> <span class="token comment">// 什么也不做</span></pre></td></tr></tbody></table></figure><p>注意,分号必须保留,以表明我们省略掉了 init-statement 。说得更准确一点,分号表示的是一个空的 init-statement</p>
<p>省略 condition 的效果等价于在条件部分写了一个 true 。因为条件的值永远是 true ,所以在循环体内必须有语句负责退出循环,否则循环就会无休止地执行下去</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">/* 条件为空 */</span> <span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token comment">// 对 i 进行处理,循环内部的代码必须能够终止迭代过程</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>我们也能省略掉 for 语句头中的 expression ,但是在这样的循环中就要求条件部分或者循环体必须改变迭代变量的值</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> v<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">;</span> cin <span class="token operator">>></span> i<span class="token punctuation">;</span> <span class="token comment">/* 表达式为空 */</span> <span class="token punctuation">)</span></pre></td></tr><tr><td data-num="3"></td><td><pre> v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><p>因为条件部分能改变 i 的值,所以这个循环无须表达式部分。其中,条件部分不断检查输入流的内容,只要读取完所有的输入或者遇到一个输入错误就终止循环</p>
<h2 id="范围-for-语句"><a class="anchor" href="#范围-for-语句">#</a> 范围 for 语句</h2>
<p>C++ 11 新标准引入了一种更简单的 for 语句,这种语句可以遍历容器或其他序列的所有元素</p>
<p>范围 for 语句(range for statement)的语法形式:</p>
<pre><code>for (declaration : expression)
statement
</code></pre>
<p>expression 表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者 vector 或 string 等类型的对象,这些类型的共同特点是拥有能返回迭代器的 begin 和 end 成员</p>
<p>declaration 定义一个变量,序列中的每个元素都得能转换成该变量的类型</p>
<ul>
<li>确保类型相容最简单的办法是使用 auto 类型说明符</li>
<li>如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型</li>
</ul>
<p>每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行 statement</p>
<p>statement 可以是一条单独的语句也可以是一个块</p>
<p>所有元素都处理完毕后循环终止</p>
<p>例如:把 vector 对象中的每个元素都翻倍</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">}</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">// 范围变量必须是引用类型,这样才能对元素执行写操作</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> <span class="token operator">&</span>r <span class="token operator">:</span> v<span class="token punctuation">)</span> <span class="token comment">// 对于 v 中的每一个元素</span></pre></td></tr><tr><td data-num="4"></td><td><pre> r <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">// 将 v 中每个元素的值翻倍</span></pre></td></tr></tbody></table></figure><p>其等价于</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> beg <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> end <span class="token operator">=</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> beg <span class="token operator">!=</span> end<span class="token punctuation">;</span> <span class="token operator">++</span>beg<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">auto</span> <span class="token operator">&</span>r <span class="token operator">=</span> <span class="token operator">*</span>beg<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> r <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>不能通过范围 for 语句增加 vector 对象(或者其他容器)的元素:因为在范围 for 语句中,预存了 end () 的值。一旦在序列中添加(删除)元素,end 函数的值就可能变得无效了</p>
<h2 id="do-while-语句"><a class="anchor" href="#do-while-语句">#</a> do while 语句</h2>
<p>do while 语句(do while statement)和 while 语句非常相似,唯一的区别是,do while 语句先执行循环体后检查条件</p>
<p>即,不管条件的值如何,do while 语句都至少执行一次循环</p>
<p>do while 语句的语法形式:</p>
<pre><code>do
statement
while (condition);
</code></pre>
<p><strong>do while 语句应该在后面用一个分号表示语句结束</strong></p>
<p>在 do while 语句中,首先执行一次 statement 然后才求 condition 的值( condition 不能为空)。如果 condition 的值为假,循环终止;否则,重复循环过程</p>
<p>condition 使用的变量必须定义在循环体之外</p>
<p>例如,可以使用 do while 循环(不断地)执行加法运算</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// 不断提示用户输入一对数,然后求其和</span></pre></td></tr><tr><td data-num="2"></td><td><pre>string rsp<span class="token punctuation">;</span> <span class="token comment">// 作为循环的条件,不能定义在 do 的内部</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">do</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> cout <span class="token operator"><<</span> <span class="token string">"please enter two values: "</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">int</span> val1 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> val2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> cin <span class="token operator">>></span> val1 <span class="token operator">>></span> val2<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> cout <span class="token operator"><<</span> <span class="token string">"The sum of "</span> <span class="token operator"><<</span> val1 <span class="token operator"><<</span> <span class="token string">" and "</span> <span class="token operator"><<</span> val2</pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token operator"><<</span> <span class="token string">" = "</span> <span class="token operator"><<</span> val1 <span class="token operator">+</span> val2 <span class="token operator"><<</span> <span class="token string">"\n\n"</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"More? Enter yes or no: "</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> cin <span class="token operator">>></span> rsp<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>rsp<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> rsp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token char">'n'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><p>因为 do while 先执行语句(或者块)后判断条件,所以不允许在条件部分定义变量</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">do</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token comment">// . . .</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">mumble</span><span class="token punctuation">(</span>foo<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token keyword">int</span> foo <span class="token operator">=</span> <span class="token function">get_foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 错误:将变量声明放在了 do while 的条件部分</span></pre></td></tr></tbody></table></figure><h1 id="跳转语句"><a class="anchor" href="#跳转语句">#</a> 跳转语句</h1>
<p>跳转语句用于中断当前的执行过程</p>
<p>C++ 语言提供了 4 种跳转语句:</p>
<ul>
<li>break</li>
<li>continue</li>
<li>goto</li>
<li>return</li>
</ul>
<h2 id="break-语句"><a class="anchor" href="#break-语句">#</a> break 语句</h2>
<p>break 语句(break statement)负责终止离它最近的 <strong>while 、do while 、for 或 switch 语句</strong>,并从这些语句之后的第一条语句开始继续执行</p>
<p>break 语句只能出现在迭代语句或者 switch 语句内部(包括嵌套在此类循环里的语句或块的内部)。<strong>break 语句的作用范围仅限于最近的循环或者 switch</strong></p>
<p>例如:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>string buf<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> buf <span class="token operator">&&</span> <span class="token operator">!</span>buf<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">switch</span><span class="token punctuation">(</span>buf<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'-'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token comment">// 处理到第一个空白为止</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> it <span class="token operator">=</span> buf<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span> it <span class="token operator">!=</span> buf<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">++</span>it<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">*</span>it <span class="token operator">==</span> <span class="token char">' '</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">// #1,离开 for 循环</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token comment">// . . .</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token comment">//break #1 将控制权转移到这里</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token comment">// 剩余的 '-' 处理</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">// #2,离开 switch 语句</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token keyword">case</span> <span class="token char">'+'</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token comment">// . . .</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token punctuation">}</span> <span class="token comment">// 结束 switch</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token comment">//break #2 将控制权转移到这里</span></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token punctuation">}</span> <span class="token comment">// 结束 while</span></pre></td></tr></tbody></table></figure><p>标记为 #1 的 break 语句负责终止连字符 case 标签后面的 for 循环。它不但不会终止 switch 语句,甚至连当前的 case 分支也终止不了。接下来,程序继续执行 for 循环之后的第一条语句,这条语句可能接着处理连字符的情况,也可能是另一条用于终止当前分支的 break 语句</p>
<p>标记为 #2 的 break 语句负责终止 switch 语句,但是不能终止 while 循环。执行完这个 break 后,程序继续执行 while 的条件部分</p>
<h2 id="continue-语句"><a class="anchor" href="#continue-语句">#</a> continue 语句</h2>
<p>continue 语句(continue statement)终止最近的循环中的当前迭代并立即开始下一次迭代</p>
<p><strong>continue 语句只能出现在 for 、while 和 do while 循环的内部</strong>,或者嵌套在此类循环里的语句或块的内部</p>
<p>和 break 语句类似的是,出现在嵌套循环中的 continue 语句也仅作用于离它最近的循环</p>
<p>和 break 语句不同的是,只有当 switch 语句嵌套在迭代语句内部时,才能在 switch 里使用 continue (即,continue 对循环起作用,而不对 switch 起作用)</p>
<p>continue 语句中断当前的迭代,但是仍然继续执行循环</p>
<ul>
<li>对于 while 或者 do while 语句来说,继续判断条件的值</li>
<li>对于传统的 for 循环来说,继续执行 for 语句头的 expression</li>
<li>对于范围 for 语句来说,用序列中的下一个元素初始化循环控制变量</li>
</ul>
<p>例如:从标准输入中读取单词并处理以下画线开头的单词</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>string buf<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> buf <span class="token operator">&&</span> <span class="token operator">!</span>buf<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>buf<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token char">'_'</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// get another input</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token comment">// still here? the input starts with an underscore; process buf . . .</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><h2 id="goto-语句"><a class="anchor" href="#goto-语句">#</a> goto 语句</h2>
<p>goto 语句(goto statement)的作用:从 goto 语句无条件跳转到同一函数内的另一条语句</p>
<blockquote>
<p>不要在程序中使用 goto 语句,因为它使得程序既难理解又难修改</p>
</blockquote>
<p>goto 语句的语法形式:</p>
<pre><code>goto label;
</code></pre>
<p>其中,label 是用于标识一条语句的标示符</p>
<p>带标签语句(labeled statement)是一种特殊的语句,在它之前有一个标示符以及一个冒号,例如:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>end<span class="token operator">:</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token comment">// 带标签语句,可以作为 goto 的目标</span></pre></td></tr></tbody></table></figure><p>标签标示符独立于变量或其他标示符的名字,因此,标签标示符可以和程序中其他实体的标识符使用同一个名字而不会相互干扰</p>
<p>goto 语句和控制权转向的那条带标签的语句必须位于同一个函数之内</p>
<p>和 switch 语句类似,goto 语句也不能将程序的控制权从变量的作用域之外转移到作用域之内:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// . . .</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">goto</span> end<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">int</span> ix <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token comment">// 错误:goto 语句绕过了一个带初始化的变量定义</span></pre></td></tr><tr><td data-num="4"></td><td><pre>end<span class="token operator">:</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token comment">// 错误:此处的代码需要 ix,但是 goto 语句绕过了它的声明</span></pre></td></tr><tr><td data-num="6"></td><td><pre> ix <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><p>向后跳过一个已经执行的定义是合法的。跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它。例如:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token comment">// backward jump over an initialized variable definition is okay</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre> begin<span class="token operator">:</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">int</span> sz <span class="token operator">=</span> <span class="token function">get_size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>sz <span class="token operator"><=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">goto</span> begin<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>在上面的代码中,goto 语句执行后将销毁 sz 。因为跳回到 begin 的动作跨过了 sz 的定义语句,所以 sz 将重新定义并初始化</p>
<h1 id="try-语句块和异常处理"><a class="anchor" href="#try-语句块和异常处理">#</a> try 语句块和异常处理</h1>
<p>异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围</p>
<p>典型的异常包括失去数据库连接以及遇到意外输入等</p>
<p>异常处理机制包括异常检测和异常处理两个部分</p>
<p>在 C++ 语言中,异常处理包括:</p>
<ul>
<li><strong>throw 表达式</strong>(throw expression):异常检测部分使用 throw 表达式来表示它遇到了无法处理的问题。通常描述为:throw 引发(raise)了异常</li>
<li><strong>try 语句块</strong>(try block):异常处理部分使用 try 语句块处理异常
<ul>
<li>try 语句块以关键字 try 开始,并以一个或多个 <strong>catch 子句</strong>(catch clause)结束</li>
<li>try 语句块中代码抛出的异常通常会被某个 catch 子句处理。catch 子句通常也被称作 <strong>异常处理代码</strong>(exception handler)</li>
</ul>
</li>
<li>一套 <strong>异常类</strong>(exception class):用于在 throw 表达式和相关的 catch 子句之间传递异常的具体信息</li>
</ul>
<h2 id="throw-表达式"><a class="anchor" href="#throw-表达式">#</a> throw 表达式</h2>
<p>throw 表达式包含关键字 throw 和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型</p>
<p>throw 表达式后面通常紧跟一个分号</p>
<p>例如:在执行两个 Sales_item 对象相加时,需要先检查它们是否是关于同一种书籍的</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre>Sales_item item1<span class="token punctuation">,</span> item2<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>cin <span class="token operator">>></span> item1 <span class="token operator">>></span> item2<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">// 首先检查两条数据是否是关于同一种书籍的</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>item1<span class="token punctuation">.</span><span class="token function">isbn</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> item2<span class="token punctuation">.</span><span class="token function">isbn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">throw</span> <span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">"Data must refer to same ISBN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token comment">// 如果程序执行到这里,则说明两个 ISBN 相同</span></pre></td></tr><tr><td data-num="7"></td><td><pre>cout <span class="token operator"><<</span> item1 <span class="token operator">+</span> item2 <span class="token operator"><<</span> endl<span class="token punctuation">;</span></pre></td></tr></tbody></table></figure><p>在这段代码中,如果 ISBN 不一样,就会抛出一个异常(该异常是类型 runtime_error 的对象)</p>
<blockquote>
<p>类型 runtime_error 是标准库异常类型的一种,定义在 stdexcept 头文件中</p>
</blockquote>
<p>抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码</p>
<h2 id="try-语句块"><a class="anchor" href="#try-语句块">#</a> try 语句块</h2>
<p>try 语句块包括关键字 try 以及紧随其后的一个块(花括号括起来的语句序列),其通用语法形式为:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">try</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> program<span class="token operator">-</span>statements</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>exception<span class="token operator">-</span>declaration<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> handler<span class="token operator">-</span>statements</pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>exception<span class="token operator">-</span>declaration<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="6"></td><td><pre> handler<span class="token operator">-</span>statements</pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">}</span> <span class="token comment">// ...</span></pre></td></tr></tbody></table></figure><p>跟在 try 块之后的是一个或多个 catch 子句</p>
<p>catch 字句包括三部分:</p>
<ul>
<li>关键字 catch</li>
<li>括号内一个(可能未命名的)对象的声明(称作异常声明,exception declaration)</li>
<li>一个块(用于处理异常)</li>
</ul>
<p>当选中某个 catch 子句处理异常之后,就会执行与之对应的块</p>
<p>catch 一旦完成,程序将会跳转到 try 语句块对应的最后一个 catch 子句之后,以继续执行后续语句</p>
<p>try 语句块中的 program-statements 可以是任意 C++ 语句,包括声明在内的</p>
<blockquote>
<p>try 语句块内声明的变量在块外部无法访问,特别是,在 catch 子句内也无法访问</p>
</blockquote>
<h3 id="编写-handler-statements"><a class="anchor" href="#编写-handler-statements">#</a> 编写 handler-statements</h3>
<p>例如:可以将程序原本需要执行的任务放在 try 语句块中(这段代码可能会抛出一个 runtime_error 类型的异常),然后在 try 语句块之后跟一个 catch 字句(用于处理类型为 runtime_error 的异常)</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tbody><tr><td data-num="1"></td><td><pre><span class="token keyword">while</span> <span class="token punctuation">(</span>cin <span class="token operator">>></span> item1 <span class="token operator">>></span> item2<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">try</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>item1<span class="token punctuation">.</span><span class="token function">isbn</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> item2<span class="token punctuation">.</span><span class="token function">isbn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">throw</span> <span class="token function">runtime_error</span><span class="token punctuation">(</span><span class="token string">"Data must refer to same ISBN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> cout <span class="token operator"><<</span> item1 <span class="token operator">+</span> item2 <span class="token operator"><<</span> endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>runtime_error err<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 异常类型为 runtime_error ,异常命名为 err</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token comment">// 提醒用户两个 ISBN 必须一致,询问是否重新输入</span></pre></td></tr><tr><td data-num="8"></td><td><pre> cout <span class="token operator"><<</span> err<span class="token punctuation">.</span><span class="token function">what</span><span class="token punctuation">(</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator"><<</span> <span class="token string">"\nTry Again? Enter y or n"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">char</span> c<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre> cin <span class="token operator">>></span> c<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>cin <span class="token operator">||</span> c <span class="token operator">==</span> <span class="token char">'n'</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">// 用户输入 'n',跳出 while 循环</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token comment">// 否则,程序控制权跳回到 while 条件部分,准备下一次迭代</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></tbody></table></figure><p>其中,what 是 runtime-error 类的一个成员函数,返回的是(初始化一个具体对象时所用的)string 对象的副本</p>
<p>在上例中,如果 try 语句块中抛出异常,catch 子句将会输出:</p>
<pre><code>Data must refer to same ISBN
Try Again? Enter y or n
</code></pre>
<h3 id="函数在寻找处理代码的过程中退出"><a class="anchor" href="#函数在寻找处理代码的过程中退出">#</a> 函数在寻找处理代码的过程中退出</h3>
<p>程序在遇到抛出异常的代码前,可能已经经过了多个 try 语句块(例如,一个 try 语句块可能调用了包含另一个 try 语句块的函数)</p>
<p>此时,寻找 异常处理代码 的过程为:</p>
<ul>
<li>当异常被抛出时,首先搜索抛出该异常的函数</li>
<li>如果没找到匹配的 catch 子句,则终止该函数,并在调用该函数的函数中继续寻找</li>
<li>以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的 catch 子句为止</li>
</ul>
<p>如果最终还是没能找到任何匹配的 catch 子句,程序将会转到名为 <strong>terminate</strong> 的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出</p>
<p>如果一段程序没有 try 语句块且发生了异常,系统也会调用 terminate 函数并终止当前程序的执行</p>
<h2 id="标准异常"><a class="anchor" href="#标准异常">#</a> 标准异常</h2>
<p>C++ 标准库定义了一组类,用于报告标准库函数遇到的问题</p>
<p>C++ 定义了 4 个包含异常类的头文件:</p>
<ul>
<li>exception 头文件定义了最通用的异常类 exception,它只报告异常的发生,不提供任何额外信息</li>
<li>stdexcept 头文件定义了几种常用的异常类(见表 5.1)
<ul>
<li><img loading="lazy" data-src="Cpp5-%E8%AF%AD%E5%8F%A5/stdexcept.webp" alt=""></li>
</ul>
</li>
<li>new 头文件定义了 bad_alloc 异常类型</li>
<li>type_info 头文件定义了 bad_cast 异常类型</li>
</ul>
<p>标准库异常类只定义了以下几种运算:</p>
<ul>
<li>创建或拷贝异常类型的对象</li>
<li>为异常类型的对象赋值</li>
</ul>
<p>对于 exception 、bad_alloc 和 bad_cast 异常类型,只能以默认初始化的方式来初始化这些类型的对象,而不允许为这些对象提供初始值</p>
<p>对于其他异常类型,则应该使用 string 对象或者 C 风格字符串来初始化这些类型的对象,而不允许使用默认初始化的方式</p>
<ul>
<li>当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息</li>
</ul>
<p>每个异常类型都只定义了一个名为 what 的成员函数:</p>
<ul>
<li>what 函数没有任何参数,返回值是一个指向 C 风格字符串的 <code>const char*</code> (该字符串的目的是提供关于异常的一些文本信息)</li>
<li>what 函数返回的 C 风格字符串的内容与异常对象的类型有关:如果异常类型有一个字符串初始值,则 what 返回该字符串;对于其他无初始值的异常类型,what 返回的内容由编译器决定</li>
</ul>
<h1 id="术语表"><a class="anchor" href="#术语表">#</a> 术语表</h1>
<p><strong>块(block)</strong>:包围在花括号内的由 0 条或多条语句组成的序列。块也是一条语句,所以只要是能使用语句的地方,就可以使用块</p>
<p><strong>break 语句(break statement)</strong>:终止离它最近的循环或 switch 语句。控制权转移到循环或 switch 之后的第一条语句</p>
<p><strong>case 标签(case label)</strong>:在 switch 语句中紧跟在 case 关键字之后的常量表达式。在同一个 switch 语句中任意两个 case 标签的值不能相同</p>
<p><strong>catch 子句(catch clause)</strong>:由 catch 关键字、括号里的异常声明以及语句块三部分组成。catch 子句的代码负责处理在异常声明中定义的异常</p>
<p><strong>复合语句(compound statement)</strong>:块</p>
<p><strong>continue 语句(continue statement)</strong>:终止离它最近的循环的当前迭代。控制权转移到 while 或 do while 语句的条件部分、或者范围 for 循环的下一次迭代、或者传统 for 循环头部的表达式</p>
<p><strong>悬垂 else(dangling else)</strong>:是一个俗语,指的是如何处理嵌套 if 语句中 if 分支多于 else 分支的情况</p>
<ul>
<li>C++ 语言规定,else 应该与前一个未匹配的 if 匹配在一起</li>
<li>使用花括号可以把位于内层的 if 语句隐藏起来,这样就能更好地控制 else 该与哪个 if 匹配</li>
</ul>
<p><strong>default 标签(default label)</strong>:是一种特殊的 case 标签,当 switch 表达式的值与所有 case 标签都无法匹配时,程序执行 default 标签下的内容</p>
<p><strong>do while 语句(do while statement)</strong>:与 while 语句类似,但 do while 语句先执行循环体,再判断条件。循环体代码至少会执行一次</p>
<p><strong>异常类(exception class)</strong>:标准库定义的一组类,用于表示程序发生的错误</p>
<p><strong>异常声明(exception declaration)</strong>:位于 catch 子句中的声明,指定了该 catch 子句能处理的异常类型</p>
<p><strong>异常处理代码(exception handler)</strong>:程序某处引发异常后,用于处理该异常的另一处代码。和 catch 子句是同义词</p>
<p><strong>异常安全(exception safe)</strong>:是一个术语,表示的含义是当抛出异常后,程序能执行正确的行为</p>
<p><strong>表达式语句(expression statement)</strong>:即一条表达式后面跟上一个分号,令表达式执行求值过程</p>
<p><strong>控制流(flow of control)</strong>:程序的执行路径</p>
<p><strong>for 语句(for statement)</strong>:提供迭代执行的迭代语句。常常用于遍历一个容器或者重复计算若干次</p>
<p><strong>goto 语句(goto statement)</strong>:令控制权无条件转移到同一函数中一个指定的带标签语句。goto 语句容易造成程序的控制流混乱,应禁止使用</p>
<p><strong>if else 语句(if else statement)</strong>:判断条件,根据其结果分别执行 if 分支或 else 分支的语句</p>
<p><strong>if 语句(if statement)</strong>:判断条件,根据其结果有选择地执行语句。如果条件为真,执行 if 分支的代码;如果条件为假,控制权转移到 if 结构之后的第一条语句</p>
<p><strong>带标签语句(labeled statement)</strong>:前面带有标签的语句。所谓标签是指一个标识符以及紧跟着的一个冒号。对于同一个标识符来说,用作标签的同时还能用于其他目的,互不干扰</p>
<p><strong>空语句(null statement)</strong>:只含有一个分号的语句</p>
<p><strong>引发(raise)</strong>:含义类似于 throw 。在 C++ 语言中既可以说抛出异常,也可以说引发异常</p>
<p><strong>范围 for 语句(range for statement)</strong>:在一个序列中进行迭代的语句</p>
<p><strong>switch 语句(switch statement)</strong>:一种条件语句</p>
<ul>
<li>首先求 switch 关键字后面表达式的值</li>
<li>如果某个 case 标签的值与表达式的值相等,程序直接跨过之前的代码从这个 case 标签开始执行</li>
<li>当所有 case 标签都无法匹配时,如果有 default 标签,从 default 标签继续执行;如果没有,结束 switch 语句</li>
</ul>
<p><strong>terminate</strong> :是一个标准库函数,当异常没有被捕捉到时调用。terminate 终止当前程序的执行</p>
<p><strong>throw 表达式(throw expression)</strong>:一种中断当前执行路径的表达式。throw 表达式抛出一个异常并把控制权转移到能处理该异常的最近的 catch 子句</p>
<p><strong>try 语句块(try block)</strong>:跟在 try 关键字后面的块,以及一个或多个 catch 子句。如果 try 语句块的代码引发异常并且其中一个 catch 子句匹配该异常类型,则异常被该 catch 子句处理。否则,异常将由外围 try 语句块处理,或者程序终止</p>
<p><strong>while 语句(while statement)</strong>:只要指定的条件为真,就一直迭代执行目标语句</p>
<p>参考:C++ Primer 中文版(第 5 版)</p>
</div><footer><div class="meta"><span class="item"><span class="icon"><i class="ic i-calendar-check"></i></span><span class="text">更新于</span><time title="修改时间:2024-06-08 23:08:00" itemprop="dateModified" datetime="2024-06-08T23:08:00+08:00">2024-06-08</time></span></div><div id="copyright"><ul><li class="author"><strong>本文作者:</strong>Jiankychen<i class="ic i-at"><em>@</em></i>Jiankychen's Blog</li><li class="link"><strong>本文链接:</strong><a href="https://jiankychen.github.io/cpp-statement.html" title="C++ 语句">https://jiankychen.github.io/cpp-statement.html</a></li><li class="license"><strong>版权声明:</strong>本站所有文章除特别声明外,均采用 <a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"><i class="ic i-creative-commons"><em>(CC)</em></i>BY-NC-SA</a> 许可协议。转载请注明出处!</li></ul></div></footer></article></div><div class="post-nav"><div class="item left"><a href="/leetcode-input&output.html" rel="prev" itemprop="url" data-background-image="https://img.timelessq.com/images/2022/07/26/9b626c5ba21d7cb4dbcba2b507688bbb.jpg" title="常见输入输出"><span class="type">上一篇</span><span class="category"><i class="ic i-flag"></i>Coding</span><h3>常见输入输出</h3></a></div><div class="item right"><a href="/cpp-functions.html" rel="next" itemprop="url" data-background-image="https://img.timelessq.com/images/2022/07/26/8fe50780c15461b629c9aeab5a7f2acd.jpg" title="C++ 函数"><span class="type">下一篇</span><span class="category"><i class="ic i-flag"></i>C++</span><h3>C++ 函数</h3></a></div></div><div class="wrap" id="comments"></div></div><div id="sidebar"><div class="inner"><div class="panels"><div class="inner"><div class="contents panel pjax" data-title="文章目录"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%AF%AD%E5%8F%A5%E4%B8%8E%E8%AF%AD%E5%8F%A5%E4%BD%9C%E7%94%A8%E5%9F%9F"><span class="toc-number">1.</span> <span class="toc-text"> 语句与语句作用域</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%AE%80%E5%8D%95%E8%AF%AD%E5%8F%A5"><span class="toc-number">1.1.</span> <span class="toc-text"> 简单语句</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%AF%AD%E5%8F%A5%E4%BD%9C%E7%94%A8%E5%9F%9F"><span class="toc-number">1.2.</span> <span class="toc-text"> 语句作用域</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%9D%A1%E4%BB%B6%E8%AF%AD%E5%8F%A5"><span class="toc-number">2.</span> <span class="toc-text"> 条件语句</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#if-%E8%AF%AD%E5%8F%A5"><span class="toc-number">2.1.</span> <span class="toc-text"> if 语句</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B5%8C%E5%A5%97-if-%E8%AF%AD%E5%8F%A5"><span class="toc-number">2.1.1.</span> <span class="toc-text"> 嵌套 if 语句</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%82%AC%E5%9E%82-else"><span class="toc-number">2.1.2.</span> <span class="toc-text"> 悬垂 else</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BD%BF%E7%94%A8%E8%8A%B1%E6%8B%AC%E5%8F%B7%E6%8E%A7%E5%88%B6%E6%89%A7%E8%A1%8C%E8%B7%AF%E5%BE%84"><span class="toc-number">2.1.3.</span> <span class="toc-text"> 使用花括号控制执行路径</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#switch-%E8%AF%AD%E5%8F%A5"><span class="toc-number">2.2.</span> <span class="toc-text"> switch 语句</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#switch-%E5%86%85%E9%83%A8%E7%9A%84%E6%8E%A7%E5%88%B6%E6%B5%81"><span class="toc-number">2.2.1.</span> <span class="toc-text"> switch 内部的控制流</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#default-%E6%A0%87%E7%AD%BE"><span class="toc-number">2.2.2.</span> <span class="toc-text"> default 标签</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%BF%AD%E4%BB%A3%E8%AF%AD%E5%8F%A5"><span class="toc-number">3.</span> <span class="toc-text"> 迭代语句</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#while-%E8%AF%AD%E5%8F%A5"><span class="toc-number">3.1.</span> <span class="toc-text"> while 语句</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BC%A0%E7%BB%9F%E7%9A%84-for-%E8%AF%AD%E5%8F%A5"><span class="toc-number">3.2.</span> <span class="toc-text"> 传统的 for 语句</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#for-%E8%AF%AD%E5%8F%A5%E5%A4%B4%E4%B8%AD%E7%9A%84%E5%A4%9A%E9%87%8D%E5%AE%9A%E4%B9%89"><span class="toc-number">3.2.1.</span> <span class="toc-text"> for 语句头中的多重定义</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%9C%81%E7%95%A5-for-%E8%AF%AD%E5%8F%A5%E5%A4%B4%E7%9A%84%E6%9F%90%E4%BA%9B%E9%83%A8%E5%88%86"><span class="toc-number">3.2.2.</span> <span class="toc-text"> 省略 for 语句头的某些部分</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%8C%83%E5%9B%B4-for-%E8%AF%AD%E5%8F%A5"><span class="toc-number">3.3.</span> <span class="toc-text"> 范围 for 语句</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#do-while-%E8%AF%AD%E5%8F%A5"><span class="toc-number">3.4.</span> <span class="toc-text"> do while 语句</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%B7%B3%E8%BD%AC%E8%AF%AD%E5%8F%A5"><span class="toc-number">4.</span> <span class="toc-text"> 跳转语句</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#break-%E8%AF%AD%E5%8F%A5"><span class="toc-number">4.1.</span> <span class="toc-text"> break 语句</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#continue-%E8%AF%AD%E5%8F%A5"><span class="toc-number">4.2.</span> <span class="toc-text"> continue 语句</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#goto-%E8%AF%AD%E5%8F%A5"><span class="toc-number">4.3.</span> <span class="toc-text"> goto 语句</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#try-%E8%AF%AD%E5%8F%A5%E5%9D%97%E5%92%8C%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86"><span class="toc-number">5.</span> <span class="toc-text"> try 语句块和异常处理</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#throw-%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="toc-number">5.1.</span> <span class="toc-text"> throw 表达式</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#try-%E8%AF%AD%E5%8F%A5%E5%9D%97"><span class="toc-number">5.2.</span> <span class="toc-text"> try 语句块</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%BC%96%E5%86%99-handler-statements"><span class="toc-number">5.2.1.</span> <span class="toc-text"> 编写 handler-statements</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%87%BD%E6%95%B0%E5%9C%A8%E5%AF%BB%E6%89%BE%E5%A4%84%E7%90%86%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%80%80%E5%87%BA"><span class="toc-number">5.2.2.</span> <span class="toc-text"> 函数在寻找处理代码的过程中退出</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%A0%87%E5%87%86%E5%BC%82%E5%B8%B8"><span class="toc-number">5.3.</span> <span class="toc-text"> 标准异常</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%9C%AF%E8%AF%AD%E8%A1%A8"><span class="toc-number">6.</span> <span class="toc-text"> 术语表</span></a></li></ol></div><div class="related panel pjax" data-title="系列文章"><ul><li><a href="/introduce-cpp.html" rel="bookmark" title="初识 C++">初识 C++</a></li><li><a href="/cpp-variables.html" rel="bookmark" title="C++ 变量和基本类型">C++ 变量和基本类型</a></li><li><a href="/cpp-vectors.html" rel="bookmark" title="C++ 字符串、向量和数组">C++ 字符串、向量和数组</a></li><li><a href="/cpp-experssions.html" rel="bookmark" title="C++ 表达式">C++ 表达式</a></li><li class="active"><a href="/cpp-statement.html" rel="bookmark" title="C++ 语句">C++ 语句</a></li><li><a href="/cpp-functions.html" rel="bookmark" title="C++ 函数">C++ 函数</a></li><li><a href="/cpp-classes.html" rel="bookmark" title="C++ 类">C++ 类</a></li></ul></div><div class="overview panel" data-title="站点概览"><div class="author" itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"><img class="image" loading="lazy" decoding="async" itemprop="image" alt="Jiankychen" src="/assets/avatar.webp"><p class="name" itemprop="name">Jiankychen</p><div class="description" itemprop="description"></div></div><nav class="state"><div class="item posts"><a href="/archives/"><span class="count">51</span><span class="name">文章</span></a></div><div class="item categories"><a href="/categories/"><span class="count">8</span><span class="name">分类</span></a></div><div class="item tags"><a href="/tags/"><span class="count">20</span><span class="name">标签</span></a></div></nav><div class="social"><a target="_blank" rel="noopener" href="https://github.com/jiankychen" class="item github" title="https://github.com/jiankychen"><i class="ic i-github"></i></a><a href="mailto:[email protected]" class="item email" title="mailto:[email protected]"><i class="ic i-envelope"></i></a><a target="_blank" rel="noopener" href="https://music.163.com/#/user/home?id=447771275" class="item music" title="https://music.163.com/#/user/home?id=447771275"><i class="ic i-cloud-music"></i></a><a target="_blank" rel="noopener" href="https://www.zhihu.com/people/jiankychen" class="item zhihu" title="https://www.zhihu.com/people/jiankychen"><i class="ic i-zhihu"></i></a></div><div class="menu"><li class="item"><a href="/" rel="section"><i class="ic i-home"></i>首页</a></li><li class="item dropdown"><a href="#" onclick="return false;"><i class="ic i-feather"></i>文章</a><ul class="submenu"><li class="item"><a href="/archives/" rel="section"><i class="ic i-list-alt"></i>归档</a></li><li class="item"><a href="/categories/" rel="section"><i class="ic i-th"></i>分类</a></li><li class="item"><a href="/tags/" rel="section"><i class="ic i-tags"></i>标签</a></li></ul></li><li class="item dropdown"><a href="#" onclick="return false;"><i class="ic i-feather"></i>链接</a><ul class="submenu"><li class="item"><a href="/peers/" rel="section"><i class="ic i-magic"></i>链环</a></li><li class="item"><a href="/friends/" rel="section"><i class="ic i-heart"></i>友链</a></li></ul></li><li class="item dropdown"><a href="#" onclick="return false;"><i class="ic i-stars"></i>关于</a><ul class="submenu"><li class="item"><a href="/owner/" rel="section"><i class="ic i-user"></i>关于博主</a></li><li class="item"><a href="/site/" rel="section"><i class="ic i-paw"></i>关于本站</a></li><li class="item"><a href="/update/" rel="section"><i class="ic i-cloud"></i>更新日志</a></li></ul></li></div></div></div></div><ul id="quick"><li class="prev pjax"><a href="/cpp-functions.html" rel="prev" title="上一篇"><i class="ic i-chevron-left"></i></a></li><li class="up"><i class="ic i-arrow-up"></i></li><li class="down"><i class="ic i-arrow-down"></i></li><li class="next pjax"><a href="/leetcode-input&output.html" rel="next" title="下一篇"><i class="ic i-chevron-right"></i></a></li><li class="percent"></li></ul></div></div><div class="dimmer"></div></div></main><footer id="footer"><div class="inner"><div class="widgets"><div class="rpost pjax"><h2>随机文章</h2><ul><li class="item"><div class="breadcrumb"><a href="/categories/Coding/" title="分类于Coding">Coding</a></div><span><a href="/leetcode-analog.html">LeetCode - 模拟专题</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/binary-search.html">二分查找</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Coding/" title="分类于Coding">Coding</a></div><span><a href="/leetcode-hashtable.html">LeetCode - 哈希表专题</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/recursive.html">递推与递归</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Coding/" title="分类于Coding">Coding</a></div><span><a href="/leetcode-sort.html">LeetCode - 排序专题</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/algorithm-complexity.html">算法复杂度</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Python/" title="分类于Python">Python</a></div><span><a href="/python-container.html">Python 数据容器</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/Dijkstra.html">Dijkstra</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/sort-algorithm.html">排序</a></span></li><li class="item"><div class="breadcrumb"><a href="/categories/Data-Structure/" title="分类于Data Structure">Data Structure</a></div><span><a href="/dynamic-programming.html">动态规划</a></span></li></ul></div><div class="rpost pjax"><h2>最新评论</h2><ul class="leancloud-recent-comment" id="new-comment"></ul></div></div><div class="status"><div class="copyright">© 2021 -<span itemprop="copyrightYear">2024</span><span class="with-love"><i class="ic i-sakura rotate"></i></span><span class="author" itemprop="copyrightHolder">Jiankychen @ Jiankychen</span></div><div class="count"><span class="post-meta-item-icon"><i class="ic i-chart-area"></i></span><span title="站点总字数">955k 字</span><span class="post-meta-divider"> | </span><span class="post-meta-item-icon"><i class="ic i-coffee"></i></span><span title="站点阅读时长">14:28</span></div><div class="powered-by">基于 <a target="_blank" rel="noopener" href="https://hexo.io/">Hexo</a> & Theme.<a target="_blank" rel="noopener" href="https://github.com/theme-shoka-x/hexo-theme-shokaX/">ShokaX</a></div></div><script src="https://unpkg.com/[email protected]/bsz.pure.mini.js"></script><div id="busuanzi-wrap"><span class="ic i-eye"></span><span id="busuanzi_container_site_pv">本站总访问量 <span id="busuanzi_value_site_pv"></span> 次</span> | <span class="ic i-user"></span><span id="busuanzi_container_site_uv">本站总访客量 <span id="busuanzi_value_site_uv"></span> 次</span></div></div></footer></div><script data-config="" type="text/javascript">var LOCAL = {
ispost: true,
path: `/cpp-statement`,
favicon: {
show: `Jiankychen`,
hide: `Jiankychen`
},
search: {
placeholder: "文章搜索",
empty: "关于 「 ${query} 」,什么也没搜到",
stats: "${time} ms 内找到 ${hits} 条结果"
},
copy_tex: true,
katex: true,
mermaid: false,
audio: undefined,
fancybox: true,
nocopy: false,
outime: true,
template: `<div class="note warning"><p><span class="label warning">文章时效性提示</span><br>这是一篇发布于 {{publish}} 天前,最后一次更新在 {{updated}} 天前的文章,部分信息可能已经发生改变,请注意甄别。</p></div>`,
quiz: {
choice: `单选题`,
multiple: `多选题`,
true_false: `判断题`,
essay: `问答题`,
gap_fill: `填空题`,
mistake: `错题备注`
},
ignores: [
(uri) => uri.includes('#'),
(uri) => new RegExp(LOCAL.path + '$').test(uri),
[]
]
};
</script><script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-6-M/pace/1.2.4/pace.min.js" async=""></script><script src="https://polyfill.io/v3/polyfill.min.js?features=default,fetch" defer=""></script><script src="/js/siteInit.js?v=0.4.2" type="module" fetchpriority="high" defer=""></script></body></html>