C/C++学习
第五章:语句
0.前导:
语句由多个或单个表达式组合并按一定规则执行。语句分为俩部分:表达式与规则。表达式已经介绍过了,现在介绍规则
学习路径:语句形式——各种规则
1.形式:
空语句:只有分号( ; )的语句
简单语句:以分号( ; )结尾的表达式语句
复合语句:由语句块包围的多条简单语句,每一个语句块都是一个作用域,并且不以分号结尾
; //空语句
int i = 8 ; //简单语句
{ //复合语句块
int j =6; //在语句块中定义的变量在执行完整个语句块后会被销毁
cout<<j<<endl;
}
2.跳转语句:
break;跳出离该语句最近的迭代语句或者switch语句,然后执行迭代语句的下一个语句
continue;停止离该语句最近的迭代语句的本次迭代,然后执行下一次迭代
goto;(不使用)
3.条件语句
if语句:
注意点都比较基础,不在此叙述
switch语句:
int a = 4;
const int b = 5;
switch(a)
{
case 4: //当符合条件时,switch语句会按顺序执行接下来每一个case,除非break
cout<<a<<endl;
break; //跳转语句,跳出最近的复合语句,并执行复合语句的下一语句
case b //标签必须为整形常量表达式
cout<<b<<endl;
break;
default: //每个switch语句最后都会有default标签
int h = 12; //最好不在switch语句中定义对象,有跳过定义使用对象的风险
}
4.迭代语句
while语句:适用于未知迭代次数的情况
string s1 = "fewf";
auto n = s1.begin();
while(n!=s1.end())
{
++n;
}
do while循环语句:先执行do语句块再执行while的条件头
//正确格式
int i = 4;
do
{
++i;
}while(i<6);
//错误:在语句块中定义的变量无法使用在while中,超出了作用域
do
{
int i = 4;
++i;
}while(i<6);
//错误,在while中不能定义变量
int i = 4;
do
{
++i;
}while(int j = 7);
普通for循环语句:
//普通for语句的语句头由(初始化语句;条件语句;迭代语句)组成,初始化语句在执行完之后就不再执行,另外俩个语句随着循环不断执行直到循环停止。
for(int i=0,j=5;i<j;++i) //在初始化语句中可以定义多个对象
{
cout<<i;
}
int i = 0;
for( ; i<5;++i) //省略初始化语句
{
cout<<i;
}
for(int i=0; ; ++i ) //省略条件语句,在循环中需要执行跳转语句否则死循环
{
if(i>=2)break;
}
for(int i=0;i<5; ) //省略迭代语句,在循环中需要执行迭代语句否则死循环
{
++i;
cout<<i<<endl;
}
范围for循环语句: 只能在拥有迭代器的类型才能使用
vector<int> v1 = {2,4,5,7};
for(auto &a : v1)
{
v1.push_back(5);
}
5.异常处理
throw关键字:
throw关键字用于抛出异常。当程序遇到错误或不符合预期的情况时,可以使用throw语句抛出一个异常对象。这个异常对象可以是任何类型,包括内置类型、自定义类型或对象。
if (condition) {
throw std::runtime_error("Something went wrong");
}
在这个例子中,如果condition为真,程序将抛出一个std::runtime_error类型的异常,并附带一条错误信息。
try语句:
try块用于包围可能抛出异常的代码。如果try块中的代码抛出了异常,程序将立即跳转到相应的catch块。catch块用于捕获并处理try块中抛出的异常。每个catch块可以指定它能够处理的异常类型。当try块中的代码抛出异常时,程序会按照catch块的顺序检查每个块,找到第一个匹配异常类型的catch块并执行。
解释try {
// 可能抛出异常的代码
} catch (std::runtime_error& e) {
// 处理std::runtime_error类型的异常
} catch (std::exception& e) {
// 处理std::exception类型的异常(包括std::runtime_error)
} catch (...) {
// 处理所有其他类型的异常
}
完整异常处理的例子:
int main() {
try {
int age = -1;
if (age < 0) {
throw std::invalid_argument("Age cannot be negative");
}
std::cout << "Age is valid." << std::endl;
} catch (std::invalid_argument& e) {
std::cerr << "Invalid argument: " << e.what() << std::endl;
} catch (std::exception& e) {
std::cerr << "Standard exception: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Unknown exception caught" << std::endl;
}
return 0;
}