《C++ Primer》第五章:语句

135 阅读4分钟

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;
}