c++ 基础语句 简述

c++ 基础语句 简述


1. 简单语句

大多数语句都以分号结束,i+5;就是表达式语句:

  • 作用就是执行并丢弃求值结果

  • 只有一个空格的是空语句包含一个分号

    ival = v1 + v2;; //第二个分号表示一条多余的空语句
    while(iter != svec.end());//循环体是空语句
    ++iter;                   //不进入循环
    
    
1.1 复合语句

用花括号括起来的语句和声明的序列,块

  • 不以分号结尾

  • 表示作用域

  • 空块等价与空语句

1.2 语句作用域
  • 如果要访问作用域外的要访问控制变量,那必须也定义在作用域外;

    但定义在作用域内的对象在作用域结束后好像并没有删除

    只是不能用此名字访问了

        int *p;
        {
            int k = 5;
            p = &k;
        }
        cout << k; //错误在作用域外没有声明它
        cout << *p; //正确指向了作用域内的它,内存没有消亡一样可以用
    

    if else 尽量加上花括号,以防代码混乱不清

    • else 会选择在最近尚未匹配的if进行匹配 -》 在没有花括号分开的情况下

      if () 1
          if () 2
          else 3 //3跟2匹配
              
      if () { 1
          if () 2
      }
      else 3 //3跟1匹配
      

2 switch 语句

提供多个选择

switch(ch) { //选择开始位置往下执行直到break 或者结尾
    case 'a':
        ++cnt;
        break;
    case 'b':
        ++cnt;
    case 'c':
        ++cnt;
    break;
    default: //上面都没匹配到
        cnt = 100;
}
// ch == 'a' or 'c'  cnt = 1;
// ch == 'b' cnt == 2;
// ch 都不是 cnt == 100;
  • case 标签必须是整型常量表达式
  • 也不能有两个一样的标签
  • default 后面必须有个语句或者空块
2.1 内部变量定义
  • switch 中如果case ‘’:定义变量没有添加花括号也就是在同个switch作用域内是会被定义的
  • 但是并不执行初始化,所以只能声明
  • 要初始化必须设置新的作用域
    switch(ch) {
    case '1': {
        int i = 5; //正确 在新的作用域
    }
        int j;
        int k = 5; //错误不能初始化
   		break;
    case '3':
        i = 3; ///报错并不在同个作用域内
        j = 6; ///正确 都在switch内
        cout << j;

    default:
        {
        }
    }
  • 同样变量使用也要在变量初始化下面

3. 迭代语句

也叫循环,执行到某个条件才停下来

3.1 while
while (condition) // 不能为空 真才往下执行
    statement //循环体内创建的变量都会经历创造销毁 
  • 只有最后一次循环所声明的对象内存会被保留,其他次都会被销毁

    证明:

    long long ks = 5;
        long long *p[3];
        p[0] = &ks;
        int t = 1;
        while (t <= 2) {
            long long k = t*2;
            p[t++] = &k;
        }
        cout << *p[0] << " ";
        cout << *p[1] << " ";
        cout << *p[2] << " ";
    // 输出: 5 4 4   表示对象k每次创造都在同一个空间,所以p[1],p[2]指向了同一个对象
    
3.2 老旧for

老旧版跟往常c语言一样

for (1 ;2 ; 3){
  	4  
}
1为首要执行
2 进入循环和每次循环的判断
3 为每次结尾的执行
    三个内容都可以为空
4 为函数体
省略判断,相当于默认为true

3.3 范围for语句

c++11新标准引入的简单for语句

  • 可遍历容器或序列的所有元素

    for (declaration : expression) //expression 必须是一个序列 比如花括号括起来的初始值列表、数组等对象,都能放回迭代器的begin和end成员
        statement;
    declaration 定义一个变量、序列的每个元素都必须能转换成该变量的类型。auto最好用
    
    • 范围for中会预存end()值,一旦在循环中添加元素或删除元素,end函数的值可能变的无效
3.4 do while 语句

和while 相似

  • 区别会先执行一次函数体
do {
    statement;
}while (condition);
    //两个内容都不能为空
  • condition 不能放入变量声明
  • condition 使用的变量必须声明在循环体外。

5. 跳转语句

c++定义了4种跳转语句 break, continue, goto 和return

5.1 break
  • 负责结束离它最近的循环语句或者switch语句
5.2 continue
  • 终止本次迭代,并立即开始下一次迭代

  • 只能出现在迭代语句内部中

5.3 goto

不要在程序中使用goto语句会把程序变得难以理解和修改

所以我们稍微认识一下就行

  • 无条件跳转到同一个函数内的另一个条语句‘
goto label;
end: return;//作为goto的目标

和switch类似

//,,,,
goto end;
int ix = 10; //错误goto语句绕过了一个带初始化的变量定义
end:
错误 ix的声明被绕过了
ix = 42;
begin: 
	int sz = 4; // 合法

6. try 语句块和异常处理

异常是指存在于运行时的反常行为,这些行为超出函数正常功能的范围。

例如:丢失数据库连接,意外输入等,处理反常可能是设计所有系统最难的一部分。

当程序的部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号表示遇到故障。

  • 信号发出方无须知道故障将在何处解决,

  • 检测出问题的部分也就完成了任务

  • thorw表达式(throw expression), 异常检测部分使用throw 表达式来表示他遇到的问题,throw引发了异常

    • 一套异常类(exception class),用于在throw表达式和有关的catch子句之间传递异常的信息
  • try语句块(try block), 异常处理部分使用try语句块处理异常。try语句块的关键字try开始,并以一个或者多个catch子句结束。

    • 语句块中代码抛出的异常通常会被某个catch子句处理,
    • catch子句“处理”异常,所以叫异常处理代码
6.1 throw 表达式

程序的异常检测部分使用 throw 表达式引发一个异常。throw后面紧随一个表达式,其中表达式类型就是抛出异常的类型后面在跟一个分号

Sales_item item1, item2; //自己定义的一个类对象
cin >> item1 >> item2;
if (item1.isbin() == item2.isbin()) {
    cout << item1+item2 <<endl;
    return 0;//成功
} else {
    cerr << "Data must refer to ..." << endl;
    return -1;//错误
}
///-----------------------上面可改写为 同等
if (item1.isbin() != item2.isbin())
    throw runtime_error("Data must refer to ..."); // 抛出异常,该异常为runtime_error的对象,终止函数,并把控制权交给能处理该异常的代码
cout << item1+item2 <<endl;
  • runtime_error 是标准库异常类型的一种, 定义在stdexceot头文件中。

    必须初始化此对象,方式:给它一个string对象伙子c的字符串

6.2 try语句块

try 语句块的通用语法形式是

  • 一开始是try,随后跟着一个块,块后跟着一个或多个catch子句

    • catch: 包含三个部分
      • 关键字 catch
      • 括号内一个对象的声明(异常声明)
      • 一个块
  • 当选中了某个 catch子句处理异常后,一旦完成,程序就跳转到最后一个catch子句之后的那个语句进行

    也就是只执行一个catch

try {
	program-statements
} catch (exception-declaration) {
    handler-statements
}catch (exception-declaration) {
    handler-statements
} //...

  • 没个块都是独立作用域,声明的其他地方都不能访问

  • try可以嵌套

    runtime_error er("error a+b<10");
        while (cin >> a >> b) {
            try {
                int i;
                if (a+b > 10)
                    throw runtime_error("a+b>10");
                else if (a+b < 10)
                    throw er;
                cout << a+b << endl;
    
            }catch (runtime_error err){
    
                cout << err.what()
                    << "\n Try Again? Enter y or n" <<endl;
                char c;
                cin >> c;
                if (! cin || c == 'n')
                    break; // 跳出while
            }
        }
    
    • 如果最终还是没能找到任何匹配的catch子句,程序转到名为termi nate的标准
      库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
6.3 标准异常
  • exception 头文件定义了异常类exception 。他只报告异常的发生,不提供其他

  • stdexcept 包含了几种常见了异常类如下:

  • new也定义了bad_alloc异常类型

  • type_info 定义了bad_cast 异常类型
    异常

  • 我们只能默认初始化的方式初始化exception,bad_alloc和bad_cast对象,不允许为这些对象提供初始值。

  • 只定义了一个what成员函数


参考:c++ prime 第五版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值