语句
关于复合语句即块
一个块就是一个作用域。
所谓块,其实也就是用花括号括起来的地方,
关于悬垂else
提一下悬垂else, 其实就是,不同语言解决该问题的思路也不同,就c++而言,它规定else与离它最近的尚未匹配的if匹配。
关于switch
该语句结束要么遇到一条break语句,要么要达到该语句的结尾。
其中有case,case和它对应的值一起构成case标签。case标签必须是整型常量表达式。并且,任何两个case标签的值不能相同。
总的来说呢,对switch还是比较陌生的,就再加一个例子吧。
char s;int num = 0;
cin >> s;
switch(s){
case 'a': case 'e': case 'i': case 'o': case 'u':
++num;
break;
default:
cout << 'null';
break;
}
注意最后的break, 可以不加,最好加上。
default标签,就是当上面没有任何一个case标签能匹配上的情况执行的。注意default前面不需要加case;
在switch内部定义变量时
感觉有点小繁琐,最好不要这样写就行了,很容易会出问题。
关于迭代语句,就是循环语句。
都是基础
记一下其中关于范围for语句
for(auto c : a)
这里c就是*a;
关于do while
先检查循环体,后检查条件,也就是说至少执行一次。
对这个比较陌生。
do {
}while();
注意最后要加分号。
关于break
有个冷知识:break语句只能出现在迭代语句或者switch内。
有就近原则;
关于continue
只能出现在loop中,不能只出现在switch内。
关于goto语句
这个就比较有意思了,书上讲了不止一遍不要使用goto语句。。😂
了解了解吧
一个例子就行了
goto end;
…
end :{}
关于try语句块和异常处理
据说处理反常行为可能是设计所有系统最难的一部分。
有三部分:
- throw 表达式,一般都说throw引发了异常
- try语句块
- 一套异常类
关于throw表达式
int a, b;
cin >> a >>b;
if(a!=b){
throw runtime_error("Date");
}
cout << a+b;
//如果程序执行到了这里,表示这a和b是相同的
cout << item1+item2 << endl;
抛出异常将终止当前函数,并把控制权转移给能处理该异常的代码。
关于try语句块
上面说到throw抛出异常之后终止当前函数,并把控制权转移,那转移到哪里去了呢?
这是try就出场了。
给出try语句块的通用语法形式:
try{
program-statements
}catch(exception-declaration){
handler-statements
}catch(exception-declaration){
handler-statements
}//…
在这里必须注意一点:try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问。
自己写了个简易版的例子:
int a, b;
while(cin >> a >>b){
try{
if(a!=b){
throw runtime_error("ab不匹配,错误");
}
else {
cout << "success" <<endl;
break;
}
}
catch(runtime_error err){
cout << err.what()<<endl<<"是否重新输入?:y/n"<<endl;
char c;
cin >> c;
if(!cin || c == 'N')
break;
}
}
每个标准库异常类都定义了名为what的成员函数,其用法在上述的例子里也是一目了然。
若没有定义what中的值,那么返回的值将由编译器决定。
如果最终没有找到任何匹配的catch子句,程序转到名为terminate的标准库函数。
要是根本没有任何try语句,那就是直接调用terminate
咳,据说编写异常安全的代码非常之困难,要是程序要求非常棒的异常处理,需要专门去学这个技术了。