《C++ Primer》读书笔记-第五章 语句

ゞ 浴缸里的玫瑰 2022-05-23 02:11 421阅读 0赞
  • 简单语句

    • 表达式语句
    • 空语句
    • 复合语句
  • 语句作用域
  • 条件语句

    • if
    • switch
  • 迭代语句

    • while
    • for
    • 范围for
    • do while
  • 跳转语句

    • break
    • continue
    • goto
    • return
  • try语句和异常处理

    • try语句
    • throw表达式
    • 异常类

      表达式语句

      表达式末尾加上分号就成了表达式语句

      作用是执行表达式并丢弃掉求值结果

      空语句

      1. //空语句使用的常见情况是,当循环的全部工作在条件部分就可以完成,我们通常会用到空语句
      2. //重复读取数据直至达到文件末尾或某次输入的值等于sought
      3. while (cin >> s && s != sought)
      4. ;//空语句

      只含有一个单独的分号,如果我们多写了一个分号

      1. int i = 0;;

      实际是两句语句,后面一个分号是空语句

      这种情况不会有什么影响,但是

      1. while( i < 10 ) ;
      2. ++i;

      空语句构成了while循环的循环体,导致死循环

    • 复合语句(块)

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

      1. //块不以分号结束
      2. while (val <= 10)
      3. {
      4. sum += val;
      5. ++val;
      6. }
      7. while (cin >> s && s!= sought)
      8. {
      9. //空块
      10. }
  1. ## ##
  2. ## 语句作用域 ##
  3. 一个块就是一个作用域
  4. ifswitchwhilefor内定义的变量都属于局部作用域
  5. ## 条件语句 ##
  6. MZF: 多加花括号会使事情变得简单很多
  7. ### if ###
  8. if语句可以嵌套
  9. if(condition)
  10. if(condition)
  11. statement
  12. else
  13. if(condition)
  14. statement
  15. else if(condition)
  16. statement
  17. 我们会通过缩进来给if...else进行配对,实际上,if的个数多余else的情况,称为悬垂else问题,else总是和离它最近的未匹配的if匹配
  18. 所以第一个else实际和内层的if匹配,整个语句开始变得复杂和难以理解
  19. 多加花括号会使事情变得简单
  20. if(condition)
  21. {
  22. if(condition)
  23. {
  24. //do something
  25. }
  26. }
  27. else
  28. {
  29. if(condition)
  30. {
  31. //do something
  32. }
  33. else if(condition)
  34. {
  35. //do something
  36. }
  37. }
  38. 花括号内的语句只有块作用域,所以对第一个else来说,内层的if是不可见的,它会和第一个if进行匹配,这也正是我们希望的
  39. ### switch ###
  40. case标签必须是整型常量表达式
  41. 一种简单明了的写法
  42. switch (i)
  43. {
  44. case 0:
  45. {
  46. //do something
  47. }
  48. break;
  49. case 1:
  50. {
  51. //do something
  52. }
  53. break;
  54. default:
  55. {
  56. //do something
  57. }
  58. break;
  59. }
  60. 如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非显式地中断这一过程
  61. 因此多加花括号和break,事件会变得简单
  62. ## 迭代语句 ##
  63. * while
  64. * for
  65. * 范围for
  66. * do while
  67. 这些语句我们都不陌生了,再把书看看就行
  68. for语句头能省略掉init-statementconditionexpression中的任何一个(或者全部)
  69. do while语句是先执行循环体再检查条件,因此无论条件是否为真,循环体至少会执行一次
  70. 注意do while不是以花括号结束的,应当在后面加上分号
  71. do
  72. {
  73. //do something
  74. } while (condition);
  75. ## 跳转语句 ##
  76. * **break负责终止离它最近的whiledo whileforswitch语句**
  77. * **continue终止当前这次迭代并立即开始下一次迭代**
  78. * 只有当switch嵌套在迭代语句内部时,才能在switch里使用continue
  79. * 不要在程序中使用goto语句
  80. goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。语法形式如下:
  81. goto label; //label为一个语句标签
  82. * 1
  83. label是用于标识一条语句的标识符。带标签语句是一种特殊的语句,在它之前有一个标识符以及一个冒号:
  84. end return; //一条带标签语句
  85. * 1
  86. switch语句类型,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内,比如
  87. goto end;
  88. int ix = 10;
  89. end:
  90. ix = 42; //错误,跳过了变量的初始化语句
  91. * 1
  92. * 2
  93. * 3
  94. * 4
  95. 向后跳过一个已经执行的定义时合法的,跳到变量定义之前意味着系统将销毁该变量,然后重新创建它。
  96. begin:
  97. int sz = get_size();
  98. if(sz < 0)
  99. {
  100. goto begin; //从作用域内跳到作用域外是合法的
  101. }
  102. * 1
  103. * 2
  104. * 3
  105. * 4
  106. * 5
  107. * 6
  108. 在实际编程中应该尽量少使用goto语句,因为这使程序难理解而且不宜修改。
  109. ## try语句和异常处理 ##
  110. 异常是指程序运行时的反常行为,这些行为超出了函数正常功能的范围,有的时候也超出了程序员的意料
  111. 通常情况下,异常会导致整个程序的终止
  112. 可以使用try语句块来处理异常。
  113. try语句块以关键字try开始,并以一个或多个catch子句结束
  114. try语句块中抛出的异常有机会被catch子句处理
  115. 我们程序员也可以主动的抛出异常,比如当检测程序中的数据库连接断开了,我们可以抛出异常来通知程序的其他部分进行处理
  116. 使用throw表达式抛出异常
  117. 要完成异常处理,除了try语句块和throw表达式外,我们还需要异常类,它负责携带异常的具体信息
  118. 标准库定义了一些异常类,不过多数情况下我们需要自定义自己的异常类
  119. Sales_item item1,item2;
  120. // 首先检查item1和item2是否表示同一种书籍的
  121. while(cin >> item1 >> item2)
  122. {
  123. try{
  124. if(item.isbn() != item2.isbn())
  125. {
  126. //该异常类型是runtime_error异常。
  127. throw runtime_error("Data must refer to same ISBN");
  128. }
  129. // 如果执行到这里说明两个ISBN是相同的。
  130. cout << item1+item2 << endl;
  131. }
  132. catch(runtime_error err)
  133. {
  134. //提示用户两个ISBN必须一致,询问是否重新输入
  135. //err类型是runtime_error,因此能推断出what是runtime_error类的一个成员函数。
  136. cout << err.what() <<"\n Try Again? Enter y or n" << endl;
  137. char c;
  138. cin >> c;
  139. if(!cin || c == 'n')
  140. break; // 跳出while循环。
  141. }
  142. }

发表评论

表情:
评论列表 (有 0 条评论,421人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ primer学习笔记 语句

    简单语句 表达式语句:一个表达式末尾加上分号,就变成了表达式语句。 空语句:只有一个单独的分号。 复合语句(块):用花括号 {}包裹起来的语句和声明的序列。一个块就是一...