C++ Primer 第四章&第五章

2021.7.14

4.1 基础

  • 使用关键字decltype时,若表达式求值结果为lvalue,则得到一个引用类型

    int *p;
    int t;
    decltype(*p) x=t;  //x为int&类型
    
  • 对于没有指定执行顺序的运算符,若表达式指向并修改了同一个对象,将引发错误并产生未定义的行为,例如:

    int i=0;
    cout<<i<<" "<<++i<<endl;    //输出不定
    

2021.8.10

4.2 算数运算符

  • 一元运算符优先级最高(正负号),其次为乘除法,再次为加减法
  • 除法运算的商一律向0取整,始终满足:(m/n)*n+m%n = m
    • 例如:-21%-8=-5,-21/5=-4,-21%5=1

4.3 逻辑和关系运算符

  • 逻辑非>比大小>是否相等>逻辑与>逻辑或

    int val=2;
    if(val){};          //为真
    if(val==true){};  //为假,会先将true转为int型的1再比较
    

4.4 赋值运算符

  • 若赋值运算符左右对象类型不同,则会将右侧运算对象转换为左侧对象的类型,再进行赋值。
  • 赋值运算符满足右结合律。左侧由右侧对象的类型转换得到。
    • val1=val2=1 正确,val1, val2均可被赋值为1
  • 切勿混淆相等运算符==与赋值运算符=

2021.8.16

4.5 递增和递减运算符

int i=0,j;
j=++i;   //j=1;i=1
j=i++;   //j=0;i=1
  • 若非必须,不建议使用后置版本,后置版本返回未+1的初始值

  • 尽量使代码简洁:

vector<int> v{1,2,3,4};
auto it=v.begin();
while(it!=v.end()&&*it>=2)cout<<*it++<<endl;

如上示例输出2,3,4

  • 避免以下错误:

    while(it!=s.end() && !isspace(*it))*it=toupper(*it++);
    /* 行为未定义,编译器可能做出如下方式中任意一种进行处理* *it=toupper(*it);* *(it+1)=toupper(*it);* 或其他方式*/
    

4.6 成员访问运算符

  • 解引用运算符优先级低于点运算符,故不可写*p.size(),应改为(*p).size()

4.7 条件运算符

  • 条件运算符? :可嵌套:

    finalgrade=(grade>90)? "outstanding":(grade<60)?"pass":"fail";
    
    • 满足右结合律
    • 代码可读性随嵌套层数增加急剧下降,建议嵌套最好不超过2/3层
  • 条件运算符优先级极低,通常需要在两端加上括号

4.8 位运算符

  • 位运算符同样可用于bitset类型
  • 关于符号位如何处理没有明确规定,强烈建议位运算符只用于处理无符号类型
  • 移位运算符>><<满足左结合律,优先级低于算数运算符,高于关系运算符、赋值运算符和条件运算符。

2021.8.17

4.9 sizeof运算符

int x=1;int *p;
sizeof(int);
sizeof x;
//两种方式均返回int类型的大小
sizeof *p;  //返回指向int型的指针的大小,指针有效与否不影响结果
  • 对数组执行sizeof时不会把数组转换成指针来处理,会返回整个数组所占空间的大小
  • string对象或vector对象执行时只返回该类型固定部分的大小

4.10 逗号运算符

  • 先对左侧的表达式求值,然后将求值结果丢弃,真正的结果是右侧表达式的值(常用在for循环中)
for(int i=0;i<sz;++i,++n){//do something
}

2021.8.19

4.11 类型转换

如果两种类型可以相互转换,那么它们就是关联的。

4.11.1 算术转换

  • 将运算符的运算对象转换乘最宽的类型

  • bool,char,unsigned char,short,unsigned short等类型进行整型提升(integral promotion)时若所有可能值都能存在int中,则提升为int,否则提升为unsigned int类型

4.11.2 其他隐式类型转换

包括:数组转换成指针,指针的转换,算术类型转换为布尔类型,转换成const常量,类类型定义的转换(例如:cin转换为bool类型,结果由istream的状态决定)

4.11.3 显式转换

  • 形式: cast-name<type>(expression)

  • cast-name有以下几种:static_cast, dynamic_cast, const_cast, reinterpret_cast四种

    • static_cast:

      任意具有明确定义的类型转换,只要不包括底层const,都可以使用static_cast

      int i=1,j=3;
      double divide=static_cast<double>(j)/i;
      void* p=&divide;   //任意非常量指针均可存入void*
      double *dp=static_cast<double*>(p);      //将void*转换回初始的指针类型
      
    • const_cast

      const_cast只能改变运算对象的底层const,只可去掉const性质,不可进行其他类型转换

      const char* pc;
      char *p=const_cast<char*>(pc);   //正确,但通过p写值是未定义的行为
      const_cast<string>(pc);       //错误,const_cast只改变常量属性
      
    • reinterpret_cast

      reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。使用是非常危险的行为,本质上依赖于机器。

      int *ip;
      char *pc=reinterpret_cast<char*>(ip);
      //pc所指真实对象是一个int而非字符
      std::string s(pc);//错误,可能导致异常的运行时行为
      
  • 应避免强制类型转换的使用

4.12 运算符优先级表 (P147)

2021.8.22

第五章 语句

5.1 简单语句

  • 使用空语句时应该加上注释

5.2 语句作用域

5.3 条件语句

5.3.1 if语句
if(a)if(b) /**/;else /**/;   //悬垂else与离它最近的尚未匹配的if匹配
5.3.2 switch语句
  • case关键字和它对于的值一起被成为case标签(case label),case标签必须是整型常量表达式

  • 任何两个case标签值不能相同,否则会引发错误

  • 一般不要省略case分支最后的break语句

  • 最好定义一共default标签以示已考虑到了默认的情况

  • 不允许跨过变量的初始化语句直接跳到改变量作用域内的另一个位置

    • 若需要为某case分支定义并初始化一共变量,应将变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外
case true:string file;int i=0;int j;break;
case false:j=3;++i;if(file.empty());
//若以上代码跳过true部分,则file与i在作用域内但未初始化,会引发错误
//j未初始化,故正确

5.4 迭代语句

5.4.1 while语句
5.4.2 传统的for语句

C++ Primer 第四章相关推荐

  1. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  2. 【c++ primer】第五版第十四章习题答案

    第十四章 重载运算与类型转换 练习14.1 在什么情况下重载的运算符与内置运算符有所区别?在什么情况下重载的运算符又与内置运算符一样? 解: 不同点: 重载操作符不保证操作数的求值顺序,例如对& ...

  3. C++ Primer Plus第四章课后编程

    C++ Primer Plus第四章课后编程 4.12 复习题* 4.13 编程练习* 三句话,希望读者可以先看* 4.12 复习题* #include<iostream> #includ ...

  4. C++ Primer Plus习题及答案-第十四章

    习题选自:C++ Primer Plus(第六版) 内容仅供参考,如有错误,欢迎指正 ! 第十四章- 代码重用笔记 复习题 1. 以A栏的类为基类时,B栏的类采用公有派生还是私有派生更合适 A B c ...

  5. C++Primer Plus (第六版)阅读笔记 + 源码分析【第四章:复合类型】

    第四章:复合类型 数组 第四章:复合类型 复合类型组成: 基本整型. 浮点类型. 数组:存储多个同类型的值.(一组特殊的数组可以存储字符串.) 结构体:存储多个不同类型的值. 指针:将数据所处位置告诉 ...

  6. C Primer Plus学习_8第四章编程练习(略带解释 )

    第四章就这样结束了,下面我们来做书后习题. 如果你愿意练习,请不要看答案. 每个程序之后可能会有一些解释,都是我做的时候遇到的问题和是如何解决的,如果你还有其他疑问,评论区见,一起探讨. ------ ...

  7. C primer plus 第四章课后编程练习答案笔记解释整理

    第四章的编程练习: 1.编写一个程序,提示用户输入名和姓,然后以"名,姓"的格式打印. 编程分析: 程序功能是读取用户输入的字符串,并且重新格式化输出.应该针对名和姓分别定义对应的 ...

  8. c语言第六版第四章答案,C primer plus 第六版 第6版 004章 第四章 编程 练习 答案 中文...

    第四章 编程练习 1.编写一个程序,提示用户输入名和姓,然后以『名,姓』的格式打印出来. char name[40]; char family[40]; printf("请输入名和姓:\n& ...

  9. C++ primer Plus(第六版)中文版 第四章 复合类型 编程答案

    // 第三章.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream>//预编译,使用iostre ...

最新文章

  1. 从源码分析DEARGUI之添加字体
  2. Spring Boot处理静态资源(自定义资源映射)
  3. 在Linux环境下给php添加mbstring扩展
  4. php调整表格样式,表格的创建以及样式修改
  5. 医学图像处理期末复习(四)
  6. 剑指 Offer 57 - II. 和为s的连续正数序列 思考分析
  7. 女生学计算机未来出路,计算机真的已经烂大街了吗,女生学计算机没出路吗?...
  8. session、token、jwt、oauth2 傻傻分不清
  9. 《天天数学》连载29:一月二十九日
  10. 加密芯片在汽车无钥匙启动行业的应用
  11. Java进阶必备,人人都能听懂的JVM
  12. DNS篇之二DNS记录类型
  13. 视频教程-Excel VBA网抓教程【你学得会】-Office/WPS
  14. 仿京东商城html网页源码
  15. 虚拟机桥接模式设置IP
  16. CSS3技巧:利用css3径向渐变做一张优惠券
  17. “无须”与“无需”最简易区别法
  18. python预测股票估值_4指数加权平均预测未来股票价格
  19. 一级计算机的分类汇总在哪里,在Excel工作表的数据列表中插入分类汇总
  20. 一种基于Gradient Boosting的公交车运行时长预测方法

热门文章

  1. http协议状态码3xx系列(301,302,303,304,305,306,307),小白易通
  2. java万能万年历的程序,java 实现万年历
  3. 51单片机题目项目汇总 - 100例
  4. html5 jssdk,微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK
  5. eslint基本知识自我总结
  6. 深度报文检测 linux,深度报文检测,deep packet inspection,音标,读音,翻译,英文例句,英语词典...
  7. python 查看某个模块包含函数方法
  8. 中州韵输入法(rime)导入搜狗词库
  9. 【语义分割】ps实现对粗标签精细标注
  10. 1号店html页面,1号店网页制作(HTML+CSS)