1. //1.当我们对运算符进行重载的时候,其包括运算对象的类型和返回值的类型都是由该运算符定义的,但是运算对象的个数和优先级,结合律都是不能改变的
  2.  
  3. //2.当一个对象被用作右值的时候,用的是对象的值(内容)。当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
  4.  
  5. //3.复合表达式:是指含有两个或多个运算符的表达式。求复合表达式的值需要首先将运算符和运算对象合理的组合在一起。优先级和结合律决定了运算对象的组合方式。
  6. // 括号无视普通的组合规则,在表达式中括号括起来的部分被当做一个单元来求值,然后再与其他部分按照优先级组合。
  7. // 优先级规定了运算对象的组合方式,但没有说明运算符对象按照说明顺序求值。对于没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将引发错误,并产生未定义的行为。
  8. // 一条形如f() + g() * h() + j()的表达式中,优先级规定g()和h()的返回值相乘。结合律规定f()的返回值先与相乘结果执行加法再与j()的返回值相加,但是对于这四个函数的调用顺序是未定义的。
  9. // 如果改变了某个运算对象的值,在表达式的其他地方不要继续使用这个运算对象,否则将导致未定义行为。这个规定有一个例外:当改变运算对象的子表达式本身就是另一个子表达式的运算对象时,上述规则无效。
  10. // 比如在表达式*++iter;中,递增运算符改变了iter的值,iter的值(已经被改变)又是解引用运算符的运算对象,此时求值顺序不会有问题。因为递增运算必须先求值然后才轮到解引用运算符。
  11. int f0(){return ;};
  12. int f1(){return ;};
  13. int value = f0() + f1(); //f0()和f1()的调用肯定在执行+前调用,但是无法知道到底是f0()先调用还是f1()先调用。若f0()和f1()修改了同一个对象,那么value值是为定义的。
  14. // 有4种运算符是规定了执行顺序的:
  15. // && 先求左侧对象的值,只有当左侧对象为真,才求右侧对象的值。
  16. // || 先求左侧对象的值,只有当左侧对象为假,才求右侧对象的值。
  17. // cmd? expl : exp2 首先求cmd的值,若为真则继续求exp1的值,若为假则求exp2的值。
  18. // , 先求左侧表达式的值,然后抛弃求值结果,再求右侧表达式的值,真正的求值结果为右侧表达式的值。
  19.  
  20. //4.在表达式求值前,小整数类型(bool, char, unsigned char, short, unsigned short)的运算对象被提升为较大的整数类型(一般为int)。
  21.  
  22. //5.溢出的问题:数据溢出是一种未定义行为,其结果是不可预知的,在不同的机器上表现不同。
  23. char value0 = ; //本机的溢出方式:500即0x1f4,由于value0是char类型,本机器又是小端模式,所以先存储低位,高位被抛弃,所以value0在内存中为0xf4,即244,再次发生溢出,所以value0的值为-(256-244) 即-12
  24.  
  25. //6.关系运算符(< <= > >= == !=)返回类型为bool。形如 a < b < c;是将a < b的结果与c进行比较,若c是一个大于1的值,那么这个表达式恒为true。
  26.  
  27. //7.++ 和 -- 其前置版本将其对象本身作为左值返回,但是其后置版本则将对象的原始值的副本作为右值返回。
  28.  
  29. //8.条件运算符:当其两个表达式都是左值或者能转换成同一种左值类型的时候,返回左值。否则返回右值。条件运算符的优先级很低,就比赋值运算符高一级。
  30.  
  31. //9.sizeof:
  32. // 返回一个表达式或者一个类型名字所占字节数
  33. // sizeof并不会实际计算其运算对象的值
  34. // 满足右结合律
  35. // 对引用类型执行sizeof会得到被引用对象所占空间大小
  36. // 对数组执行sizeof将得到整个数组所占空间大小
  37. // 对vector或者string等执行sizeof只返回该类型固定部分的大小,不会计算对象中的元素占有的空间
  38. // 返回值为常量表达式
  39.  
  40. //10.逗号运算符:首先求左侧的值,然后丢弃求值结果,返回右侧表达式的值,如果右侧表达式是左值,其返回也是左值,否则为右值
  41.  
  42. //11.发生隐式类型转换的地方:
  43. // 在大多数表达式中,比int类型小的整形先转为较大的整数类型
  44. // 在条件中,非布尔类型转为布尔类型
  45. // 在初始化和赋值的过程中,右侧表达式转为左侧运算对象的类型
  46. // 如果算数类型或关系运算的的运算对象有多种类型,需要转为同一类型(运算符的运算对象将转化为最宽的类型)。C++不会将不同类型的对象进行算术操作,而是先根据类型转换规则将运算对象的类型同一后再求值。
  47. // 函数调用时
  48. // 在大多数用到数组的表达式中,数组会转化为指向数组首元素的指针。函数也会执行类似转换
  49. //
  50. int value1 = 1.2 + ; //value1 = 3 求值过程为将2转为double类型与1.2相加,让后将结果3.2赋值给int类型
  51.  
  52. //12.运算符优先级与结合律:
  53. /*
  54. 第一级:
  55. ::      全局作用域      左结合
  56. ::      类作用域       左结合
  57. ::      命名空间作用域    左结合
  58.  
  59. 第二级:
  60. .       成员选择       左结合
  61. ->      成员选择       左结合
  62. []      下标         左结合
  63. ()      函数调用       左结合
  64. ()      类型构造       左结合
  65.  
  66. 第三级:
  67. ++      后置递增运算符    右结合
  68. --      后置递减运算符    右结合
  69. typeid    类型         右结合
  70. typeid    运行时类型      右结合
  71. explicit cast 类型转换   右结合 static_cast const_cast, reinterpret_cast, dynamic_cast
  72.  
  73. 第四级:
  74. ++      前置递增运算 右结合
  75. --      前置递减运算 右结合
  76. ~       位取反        右结合
  77. !       逻辑非        右结合
  78. -       一元负号       右结合
  79. +       一元正号       右结合
  80. *       解引用       右结合
  81. &       取地址        右结合
  82. ()      类型转换 右结合
  83. sizeof  对象大小 右结合 sizeof value;
  84. sizeof   类型大小 右结合 sizeof(int);
  85. sizeof...  参数包大小     右结合
  86. new     创建对象       右结合
  87. new[]   创建数组       右结合
  88. delete   释放对象       右结合
  89. delete[]  释放数组       右结合
  90. noexcept  能否抛出异常     右结合
  91.  
  92. 第五级:
  93. ->*     指向成员选择的指针 左结合 ptr->*p
  94. .* 指向成员选择的指针 左结合 ptr.*p
  95.  
  96. 第六级:
  97. *  乘法 左结合
  98. /  除法 左结合
  99. %   取余 左结合
  100.  
  101. 第七级:
  102. + 加法 左结合
  103. - 减法 左结合
  104.  
  105. 第八级:
  106. << 左移位 左结合
  107. >> 右移位 左结合
  108.  
  109. 第九级:
  110. < 小于 左结合
  111. > 大于 左结合
  112. <= 小于等于 左结合
  113. >= 大于等于 左结合
  114.  
  115. 第十级:
  116. == 相等 左结合
  117. != 不相等 左结合
  118.  
  119. 第十一级:
  120. & 位与 左结合
  121.  
  122. 第十二级:
  123. ^ 位异或 左结合
  124.  
  125. 第十三级:
  126. | 位或 左结合
  127.  
  128. 第十四级:
  129. && 逻辑与 左结合
  130.  
  131. 第十五级:
  132. || 逻辑或 左结合
  133.  
  134. 第十六级:
  135. ? : 条件 右结合
  136.  
  137. 第十七级:
  138. = 右结合
  139. *=
  140. /=
  141. %=
  142. +=
  143. -=
  144. <<=
  145. >>=
  146. &=
  147. |=
  148. ^=
  149.  
  150. 第十八级:
  151. throw 抛出异常 右结合
  152.  
  153. 第十九级:
  154. , 逗号 左结合
  155. */

C++Primer 第四章的更多相关文章

  1. <<C++ Primer>> 第四章 表达式

    术语表 第 4 章 表达式 算术转换(arithmetic conversion): 从一种算术类型转换成另一种算术类型.在二元运算符的上下文中,为了保留精度,算术转换通常把较小的类型转换成较大的类型 ...

  2. c++primer 第四章编程练习答案

    4.13.1 #include<iostream> struct students { ]; ]; char grade; int age; }; int main() { using n ...

  3. C Primer Plus_第四章_字符串和格式化输入输出_编程练习

    Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...

  4. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  5. C++ Primer Plus学习:第十四章

    第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...

  6. C++ Primer Plus学习:第四章

    C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...

  7. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  8. 【C++】《C++ Primer 》第四章

    第四章 表达式 一.基础 重载运算符:当运算符作用在类类型的运算对象时,用户可以自行定义其含义. 左值和右值: C中:左值可以在表达式左边,右值不能. C++中:当一个对象被用作右值的时候,用的是对象 ...

  9. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

随机推荐

  1. android导入项目出现R文件不能生成

    关于原因网上有好多,比如 1.有时候eclipse不自动编译,把project clean一下,让R.java重新生成   2.选择菜单  Project >> Clean ,前提是勾选上 ...

  2. BLE-NRF51822教程19-Battery Service

    Battery Service是有关电池特性方面的服务,如果需要它,在初始化时将它加入到蓝牙协议栈. 如果通过ble_bas_battery_level_update(),电池电量将会通知,Batte ...

  3. js 判断js函数、变量是否存在

    //是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == "function&q ...

  4. Prism&MEF构建开发框架 (三)

    菜单管控模块EntityFW 菜单的加载采用MEF技术,程序实现思路: 1 .主菜单加载页面MainMenuView.xaml指向MenuRegion 2. 菜单Item点击及内容加载,采用订阅模式, ...

  5. Eclipse 常用整理

    1.编译 eclipse默认是修改程序后自动编译的,如果不能自动编译,你可以查看project->build automatically选项是否被选中. 手动编译整个工程,可以使用Project ...

  6. 去除undefined和末尾逗号及把字符串数字转成数字数组的方法

    function removeundefined(str){   var v=new Array(),b="";   var tmp=fil(str); for(var i=0;i ...

  7. js的执行顺序

    js是顺序执行的,但是在一个<script></script>标签中,后面的函数会预加载.如: <script type="text/javascript&qu ...

  8. h5固定表头公共样式

    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scal ...

  9. SQL Server Logical/Physical Reads

    Summary Info: Logical Reads :    Reading Data pages from CachePhysical Reads :    Reading Data pages ...

  10. day05-java-(循环问题,数组)

    day05-java-(循环问题,数组) 1.三种循环结构的更佳适用情况:  1)while: "当..."循环  2)do...while: "直到..."循 ...