第5章:语句

  • #1.简单语句
  • #2.语句作用域
  • #3.条件语句
    • 3.1 if语句
    • 3.2 switch语句
  • #4.迭代语句
    • 4.1 while语句
    • 4.2 传统的for语句
    • 4.3 范围for语句
    • 4.4 do while语句
  • #5.跳转语句
    • 5.1 break语句
    • 5.2 continue语句
    • 5.3 goto语句
  • #6.TRY语句块和异常处理
    • 6.1 throw表达式
    • 6.2 try语句块
    • 6.3 标准异常

#1. 简单语句

C++语言中大多数语句都以分号结束,一个表达式,末尾加上分号就变成了表达式语句

空语句

最简单的语句就是空语句,空语句中只含有一个单独的分号:

; //空语句
别漏写分号,也别多写分号

因为空语句是一条语句,所以可以用在任何允许使用语句的地方。

int v1 = 1,v2 = 2,ival;
ival = v1 + v2;; //正确:第二个分号表示一条多余的空语句
复合语句(块)

复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称为


#2. 语句作用域

可以在if、switch、while和for语句的控制结构中定义变量。定义在控制结构当中的变量只在相应的语句的内部可见,一旦语句结束,变量也就超出其作用范围了:

while(int i = get_num()) { //每次迭代时创建并初始化i
    cout << i << endl;
}
i = 0; //错误:在循环体外部无法访问i

#3. 条件语句

C++语言提供了两种按条件执行的语句。一种是if语句,它根据条件决定控制流;另外一种是switch语句,它计算一个整形表达式的值,然后根据这个值从几条执行路径中选择一条。

3.1 if语句

if语句的作用是:判断一个指定的条件是否为真,根据判断的结果决定是否执行另外一条语句。if语句包括两种形式:一种含有else分支,另外一种没有。简单if语句的语法形式是:

if(condition)
    statement

if else语句的形式是:

if(condition)
    statement
else 
    statement2

3.2 switch语句

switch语句提供了一条便利的途径使得我们能够在若干固定选项中做出选择。


#4. 迭代语句

迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体前检查条件,do while语句先执行循环体,然后再检查条件。

4.1 while语句

只要条件为真,while语句就重复地执行循环体,它的语法形式是:

while(condition) 
    statement

==定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。==

使用while循环

当不确定到底迭代多少次时,使用while循环比较合适。

vector<int> v;
int i;
//重复读入数据,直至到达文件末尾或者遇到其他输入问题
while(cin >> i) {
    v.push_back(i);
}
auto beg = v.begin();
while(beg != v.end() && *beg >= 0) {
    ++beg;
}
if(beg == v.end) {
    ...
}

4.2 传统的for语句

for语句的语法形式:

for(init-statement;condition;expression) {
    statement;
}
传统for循环的执行流程

以下面的for循环为例:

for(decltype(s.size()) index = 0;index != s.size() && !isspace(index);++index) {
    s[index] = toupper(s[index]); //将当前的字符改成大写形式
}

求值的顺序如下所示:

  1. 循环开始,首先执行一次init-statement。此例中,定义index并初始化为0。
  2. 接下来判断condition。如果index不等于s.size()而且在s[index]位置的字符不是空白,则执行for循环体的内容。否则,循环终止。如果第一次迭代时条件为假,for循环体一次也不会执行。
  3. 如果条件为真,执行循环体。此例中将s[index]位置的字符改写成大写形式。
  4. 最后执行expression。此例中,将index的值加1。

4.3 范围for语句

C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句的语法形式是:

for(declaration:expression)
    statement

expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vector或string等类型的对象,这些类型的共同特点是能返回迭代器的begin和end成员。

declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符。

vector<int> ivec = {0,1,2,3,4,5};
for(auto &r : ivec) {
    r *= 2; //对于ivec中的每一个元素
}

4.4 do-while语句

do-while语句和while语句非常相似,唯一的区别是,do-while语句先执行循环体后检查条件。不管条件的值如何,都至少执行一次循环。do-while语句的语法形式如下所示:

do 
    statement
while(condition);

#5. 跳转语句

跳转语句中断当前执行的过程。C++语言提供了4种跳转语句:break、continue、goto和return。

5.1 break语句

break语句负责终止离它最近的while、do-while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。

5.2 continue语句

continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do-while循环的内部,或者嵌套在此类循环里的语句或块的内部。

string buf;
while(cin >> buf && !buf.empty()) {
    if(buf[0] != '_')
        continue; //接着读取下一个输入
}

5.3 goto语句

goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。goto语句的语法形式:

goto label;

其中,label是用于标识一条语句的标示符。带标签语句是一种特殊的语句,在它之前有一个标示符以及一个冒号:

end:return; //带标签语句,可以作为goto的目标

#6. try语句块和异常处理

异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:

  • throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。即throw引发了异常。
  • try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch字句结束。try语句块中代码抛出的异常通常会被某个catch字句处理。因此catch字句处理异常,所以它们也被称作异常处理代码
  • 一套异常类,用于在throw表达式和相关的catch字句之间传递异常的具体信息。

6.1 throw表达式

程序的异常检测部分使用throw表达式引发一个异常。

if (item.isbn() != item2.isbn()) {
    throw runtime_error("Data must refer to same ISBN");
}

6.2 try语句块

try语句块的通用语法形式是:

try{
//program-statements
}catch(exception-declaration){
//handler-statements
}catch(exception-declaration){
//handler-statements
}

6.3 标准异常

C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中:

  • exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外的信息。
  • stdexcept头文件定义了几种常用的异常类。
  • new头文件定义了bad_alloc异常类型。
  • type_info头文件定义了bad_cast异常类型。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容