c++ primer 第五版学习笔记-第五章 语句

5.1 简单语句

 

1.绝大多数语句以分号结束。空语句只有一个单独的分号。

 

2.复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称作块。

一个块就是一个作用域,在块中引入的名字只能在块内部以及嵌套在块中的子块里访问。

 

5.2 语句作用域

 

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

swtich可以定义,但不允许显示/隐式初始化

case 1:
    string s;//错误,绕过隐式初始化
    int i=0;//错误,绕过显式初始化
    int j;//正确,没有初始化
break;
case 2:
    j=10;//正确
    if(s.empty())//s在作用域内,但s没有被初始化
        ...
break;

 

5.3 条件语句

 

 

1.C++提供了两种按条件执行的语句。

一种是if语句,它根据条件决定控制流。

一种是switch语句,它计算一个整型表达式的值,然后根据这个值从几条执行路径中选择一条。

 

2.if语句的作用是:判断一个指定的条件是否为真,根据判断结果决定是否执行另外一条语句。

 悬垂else:指有4个if语句,2个else语句,不知道哪个if和哪个else相匹配。

 

3.switch语句首先对括号里的表达式求值,表达式值转换成整数类型,然后与每个case标签的值比较。

case关键字和它对应的值一起被成为case标签。case标签必须是整型常量表达式。

 

4.如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。

 

5.4 迭代语句

 

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

 

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

范围for语句的语法形式是:

for(declaration: expression)

     statement;

 

5.5 跳转语句

 

1.C++提供了4种跳转语句:break,continue,goto和return。

 

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

 

3. continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。只能出现在for,while,do while语句里。

 

4.goto语句的作用是从goto语句无条件跳转到同一函数的另一条语句。

 

5.6 try语句块和异常处理

 

1.在C++语言中,异常处理包括:

throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。

throw std::runtime_error("Shit!");
//抛出异常,终止当前函数,转交给处理异常的代码
//runtime_error一种异常类型,#include <stdexcept>

 

try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常处理代码

 

//读入一个数x,要求1<=x<=100
int x;
using namespace std;
while(cin>>x)
    try
    {
        if(x>100)throw overflow_error("Too Big");
        if(x<1)throw underflow_error("Too Small");
        cout<<"Accepted"<<endl; 
    }catch (overflow_error err1)
    {
        cout<<err1.what()<<endl;
        break;//数据越界,退出while循环
    }catch (underflow_error err2)
    {
        cout<<err2.what()<<endl;
        break;//数据越界,退出while循环
    }

 

一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。

 

 

2.程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。

 

3.try语句块的通用语法形式是

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


try语句块一开始是关键字try,随后紧跟着一个块,这个块就像大多数时候那样是花括号括起来的语句序列。

跟在try块之后的是一个或多个catch子句。catch子句包括三部分:关键字catch、括号内一个(可能是未命名的)对象声明(称作异常声明)以及一个块。当选中了某个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。

try语句块中的program-statements组成程序的正常逻辑,像其他任何块一样,program-statements可以有包括声明在内的任意C++语句。

 

常见的异常:

#include <iostream>
 #include <stdexcept>
 using namespace std;
 int main()
 {
     try {
         int a = 0;
         int b = 1;
         if (a == 0) {
             throw range_error("dividend can not be zero");
         }
 
         cout << "b / a: " << b / a << endl;
     } catch (range_error err) {
         cout << "range_error msg: " << err.what() << endl;
         return -1;
     } catch (...) {
         cout << "unknow error << endl;
         return -1;
     }
     return 0;
 }err.what() << endl;
         return -1;
     } catch (...) {
         cout << "unknow error << endl;
         return -1;
     }
     return 0;
 }

err.what():err的类型是runtime_error,因此能推断出what是ruantime_error类的一个成员函数,这些函数没有参数,返回值是C风格字符串(即const char*).其中,runtime_error的what成员返回的是初始化一个具体对象时候所用的string对象的副本。

 

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

exception头文件定义了最通常的异常类exception。它只报告异常的发生,不提供额外信息。

stdexcept头文件定义了几中常用的异常类。

new头文件定义了bad_alloc异常类型。只能默认初始化。

type_info头文件定义了bad_cast异常类型。只能默认初始化。

 

5.<stdexcept>定义的异常类

exception            最常见的问题
runtime_error      运行时错误:仅在运行时才能检测到得错误
range_error         运行时错误:生成的结果超出了有意义的值域范围
overflow_error     运行时错误:计算上溢
underflow_error   运行时错误 :计算下溢
logic_error           逻辑错误:可在运行前检测到得问题
domain_error       逻辑错误:参数的结果值不存在
invalid_argument 逻辑错误:不合适的参数
length_error         逻辑错误:试图生成 一个超出改类型最大长度的对象
out_of_range       逻辑错误:使用一个超出有效范围的值

exception以外,以上其他异常不能默认初始化,必须用字符串初始化

 

练习5.14

#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	string str1,str;
	int max = 1;
	int index = 1;
	cin >> str;
	string strmax=str1;
	string max1 = str1;
	while (cin >> str)
	{
		if (str == strmax)
		{
			index++;
			if (max <= index)
			{
				max++;
				max1 = str;
			}
		}
		else
		{
			if (index >= max)
			{
				max = index;
				max1 = strmax;
			}
			index = 1;
		}
		strmax = str;
	}
	if (max == 1)
		cout << "任何单词没有连续出现过" << endl;
	else
		cout << "单词" << max1 << "出现了" << max << "次" << endl;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值