语句
简单语句
-
语法上需要一条语句,逻辑上不需要时,使用空语句
- 应该加上注释,从而让读代码的人知道这条语句是有意省略的
- 多余的空语句并非总是无害的,可能导致死循环
-
语法上需要一条语句,逻辑上需要多条语句,则应使用复合语句
-
空块:内部没有任何语句的一对花括号,等价于空语句
-
while (i <= 10)
ans += i, ++i;
可以用逗号替代,但是代码的可读性降低
-
条件语句
-
if后的条件一定要用括号括起来
-
case关键字 后面的值一定要是整型常量表达式,break语句一般不会省略,不写要也注释
- ```case 1: case 3: case 5: case 7: case 9:``
- 而非
case 1, 3, 5, 7, 9:
-
default标签 告诉读者已经考虑了默认情况
-
noskipws (no skip whitespace) 不省略空格、制表、空白符,可以保留默认跳过的空格
-
ix = static_cast(ivec.size())-1;
size() 类型转换
迭代语句
-
while(beg!=v.end()&&*beg>=0)
注:利用短路求值 要先判断是否到了末尾 -
using std::pair;
键值对 -
pair<string, int> max_duplicated; int count = 0; for (string str, prestr; cin >> str; prestr = str) //前后迭代在for中的使用 { if (str == prestr) ++count; else count = 0; if (count > max_duplicated.second) max_duplicated = { prestr, count }; }// 键值对用法示例,实际count需要在此基础上+1
-
范围for语句
-
for(declaration:expression) statement
-
expression 必须是一个序列,如花括号初始值列表、数组、vector、string 共同特点是能返回迭代器的begin和end成员
-
declaration定义一个变量,可以用auto类型说明符。
-
vector<int> v={0,1,2,3,4,5,6,7,8,9} for(auto &r:v){ r*=2; } //等价于 for(auto beg=v.begin(),end=v.en();beg!=end;++beg){ auto &r=*beg; r*=2; }//不能通过范围for语句增加vector对象的元素,否则begin end返回值会被改变
-
-
-
DO WHILE语句
-
do statement while(condition);//最后的分号不能少
-
不允许在条件部分定义变量,因为在后面
-
while (!rsp.empty() && tolower(rsp[0]) == 'y');//兼顾用户交互和默认情况
-
-
break语句: 作用范围仅限于最近的循环或switch
-
if (cin.eof()) //判断输入是否结束,即正常结束文件
-
continue:
- 用于离它最近的循环
- 只有switch语句嵌套在迭代语句内部时,才能在switch里使用continue
- while do while,继续判断条件的值
- 传统for循环 继续指向for语句头expression
- 范围for循环 用序列下一个元素初始化循环控制变量
-
goto:
-
不能将程序的控制权从变量的作用域之外转移到作用域之内
-
跳回变量定义之前意味着系统销毁变量,重新创建它
-
goto label; //label 用于标识一条语句的标识符 //带标签语句,在语句前有一个标识符以及一个冒号 label: ;//带标签语句,可用作goto的目标 //标签标识符独立于变量和其它标识符
-
TRY语句块和异常处理
if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN");
// if we're still here, the ISBNs are the same
cout << item1 + item2 << endl;
} catch (runtime_error err) {
//runtime_error 是标准库异常种类的一种,定义在stdexcept头文件
//初始化runtime_error ,给它提供一个string或c字符串
try{
program-statements
}catch (excetion-declaration){
handle-statements
}catch (excetion-declaration){
handle-statements
}//..
//try语句块内声明的变量在块外无法访问,catch子句内也无法访
while (cin >> item1 >> item2) {
try {
if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN");
cout << item1 + item2 << endl;
} catch (runtime_error err) {
cout << err.what()//输出给出的字符串
<< "\nTry Again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break; // break out of the while loop
} // ends the catch clause
} // ends the while
-
c++库函数定义了一组异常类
- exception头文件定义了最通常的异常类exception,只报告异常发生不提供额外信息
- stdexcept头文件定义了几种常见异常类
- new头文件定义了bad_alloc异常类
- type_info头文件定义了bad_cast异常类
-
stdexcept头文件定义了几种常见异常类
-
excpetion //最常见的问题
-
runtime_error //只有在运行时才能检测出的问题
-
range_error //运行时错误:生成的结果超出有意义的范围
-
overflow_error //运行时错误:计算上溢
-
underfloe_error //运行时错误:计算下溢
-
logic_error //程序逻辑错误
-
domain_error //逻辑错误:参数对应的结果不存在
-
invalid_argument //逻辑错误:无效参数
-
length_error //逻辑错误:试图创建一个超出类型虽大长度的对象
-
out_of_range //使用一个超出有效范围的
-
默认初始化 exception bad_alloc bad_cast
-
其它异常类型,应该使用string或c风格字符串初始化对象,不允许默认初始化
-
异常类型只有一个what的成员函数,没有参数,返回值是c风格字符串的const char*
- 提供关于异常的一些文本信息
- 有字符串初值:what成员函数返回字符串
- 其它异常类型:由编译器决定
ps: 课堂笔记,在不懂的知识方面大多给出了老师的内容