我的C++primer长征之路:语句

语句

switch-case语句

unsigned aCnt = 0, iCnt = 0, eCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while(cin >> ch){
    switch (ch){
        case 'a':
            ++aCnt;
            break;
        case 'e':
            ++eCnt;
            break;
        case 'i':
            ++iCnt;
            break;
        case 'o':
            ++oCnt;
            break;
        case 'u':
            ++uCnt;
            break;
        default :
            break;
    }
}

case标签必须是整型常量表达式。

传统for循环

for (init-statement; condition; expression)
    statement

能省略掉三个部分中任意一个或者全部。如果省略condition,则默认为true。
但是init-statement只能由一句声明语句,因此所有的变量基础类型必须相同。

范围for语句
C++11新标准

for (declaration : expression)
    statement

while语句

while (condition)
    statement

do-while语句

do 
    statement
while (condition); //注意分号

condition变量必须定义在循环体之外。

try语句块和异常处理

throw表达式

Sales_item item1, item2;
cin >> item1 >> item2;
if(item1.isbn() != item2.isbn()){
    throw runtime_error("Data must refer to the same ISBN"); //字符串初始化一个runtime_error对象
}
cout << item1 + item2 <<endl;

try语句块

try{
    program-statements
} 
    catch (exception-declaration){
        handle-statements
    }
    catch (exception-declaration){
        handle-statements
    }

其中声明在try语句块内部的变量在外部无法访问,catch块中也是。

标准异常
异常类包含在4个头文件中。

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

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

  • new头文件定义了bad_alloc异常类型。

  • type_info定义了bad_cast异常类。

    stdexcept定义的异常类
    exception最常见的问题
    runtime_error只有运行时才能检测出来的问题
    range_error运行时错误:生成的结果超出了有意义的值域范围
    overflow_error运行时错误:计算上溢
    underflow_error运行时错误:计算下溢
    logic_error程序逻辑错误
    domain_error逻辑错误,参数对应的结果值不存在
    invalid_argument逻辑错误:无效参数
    length_error逻辑错误:试图创建一个超出该类型最大长度的对象
    out_of_range逻辑错误:使用一个超出有效范围的值

    对于exception、bad_alloc、bad_cast,只能以默认初始化的方式初始化,不允许为这些对象赋初值。
    而其他类型的对象恰好相反,应当使用string对象或者C风格字符串初始化这些类型的对象,不能使用默认初始化方式。
    异常类型只定义了一个what()成员函数,没有任何参数,返回一个指向C风格字符串的const char*。

    小练习 :
    编写一个程序,从标准输入读取两个数,输出第一个数除以第二个数的结果。用try语句捕获异常,并输出相应提示信息。

    #include<iostream>
    #include<stdexcept>
    using std::cin; using std::cout; using std::endl; using std::runtime_error;
    int main(){
        int num1, num2;
        int ans;
        cin >> num1 >> num2;
        try{
            if(num2 == 0){
                throw runtime_error("Divided by 0!!");
            }
            ans = num1 / num2;
            cout << ans << endl;
        }
        catch (runtime_error err){
            cout << err.what() << "\nTry again? Enter y or n ." << endl;
            char c;
            cin >> c;
            if (!cin || c == 'n'){
                break;
            }
        }
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值