<<C++ Primer>> 第四章 表达式
术语表
第 4 章 表达式
算术转换(arithmetic conversion): 从一种算术类型转换成另一种算术类型。在二元运算符的上下文中,为了保留精度,算术转换通常把较小的类型转换成较大的类型(例如整型转换成浮点型)。
集合律(associativitay): 规定具有相同优先级的运算符如何组合在一起。结合律分为左结合律(运算符从左到右组合)和右集合律(运算符从右到左组合)。
二元运算符(binary operator): 有两个运算对象参与运算的运算符。
强制类型转换(cast): 一种显式的类型转换。
复合表达式(compound expression): 含有多于一个运算符的表达式。
const_cast: 一种涉及 const 的强制类型转换。将底层 const 对象转换成对应的非常量类型,或者执行相反的转换。
转换(conversion): 一种类型的值改变成另一种类型的值的过程。
dynamic_cast: 和继承及运行时类型识别一起使用。
表达式(expression): C++程序中最低级别的计算。表达式将运算符作用于一个或多个运算对象,每个表达式都有对应的求值结果。表达式本身也可以作为运算兑现转换成所需的类型。
隐式转换(implicit conversoin): 由编译器自动执行的类型转换。假如表达式需要某种特定的类型而运算对象是另外一种类型,此时只要规则允许,编译器就会自动地将运算对象转换成所需的类型。
整型提升(integral promotion): 把一种较小的整型类型转换成与之最接近的较大整数类型的过程。不论是否真的需要,小数类型(即 short, char 等)总会得到提升。
左值(lvalue): 是指那些求值结果为对象或函数的表达式。一个表示对象的非常量左值可以作为赋值运算符的左侧运算对象。
运算对象(operand): 表达式在某些值执行运算,这些值就是运算对象。一个运算符由一个或多个相关的运算对象。
运算符(operator): 决定表达式所做操作的符号。C++语言定义了一套运算符并说明了这些运算符作用于内置类型时的含义。C++还定义了运算符的优先级和结合律以及每种运算符处理的运算对象数量。可以重载运算符使其能处理类类型。
求值顺序(order of evaluation): 是某个运算符的运算对象的求值顺序。大多数情况下,编译器可以任意选择运算对象求值的顺序。不过运算对象一定要在运算符之前得到求值结果。只用 &&,|| ,条件和逗号四种运算符明确规定了求值顺序。
重载运算符(overloaded operator): 针对某种运算符重新定义的适用于类类型的版本。
优先级(precedence): 规定了复合表达式中不同运算符的执行顺序。与低优先级的运算符相比,高优先级的运算符组合得更紧密。
提升(promoted): 参见整型提升。
reinterpret_cast: 把运算对象的内容解释成另外一种。这种强制类型转换本质上依赖于机器而且非常危险。
结果(result): 计算表达式得到的值或对象。
右值(rvalue): 是指一种表达式,其结果是值而非值所在的位置。
短路求值(short-circuit evaluation): 是一种专有名词,描述逻辑与和逻辑或运算符的执行过程。如果根据运算符的第一个运算对象就能确定整个表达式的结果,求值终止,此时第二个运算对象将不会被求值。
sizeof: 是一个运算符,返回存储对象所需的字节数,该对象的类型可能是某个给定的类型名字,也可能由表达式的返回结果确定。
static_cast: 显式地执行某种定义明确的类型转换,常用于替换由编译器隐式执行的类型转换。
一元运算符(unary operators): 只用一个运算对象参与对象参与运算的运算符。
** , 运算符( , operator):** 逗号运算符,是一种从左到右求值的二元运算符。逗号运算符的结果是右侧运算对象的值,当且仅当右侧运算对象是左值时逗号运算符的结果时左值。
** ? 运算符( ?operator):** 条件运算符,以下述形式提供 if-then-else 逻辑的表达式
cond ? expr1 : expr2;
如果条件 cond 为真,对exp1求值;否则对 expr2 求值。 expr1 和 expr2 的类型应该相同或者能转换成同一种类型。expr1 和 expr2 中只有一个会被求值。
&& 运算符(&& operator): 逻辑与运算符,如果两个运算对象都是真,结果才为真。只有当左侧运算对象为真时才会检测右侧运算对象。
& 运算符(& operator):位与运算符,由两个运算对象生成的一个新的整型值。如果两个运算对象对应的位都是1,所得结果中该位i二位1;否则所得结果中该位为0。
^ 运算符(^ operator): 位异或运算符,由两个元对象生成一个新的整型值。如果两个运算对象对应的为有且只有一个是1,所得结果中该位为1;否则所得结果中该位为0。
|| 运算符(|| operator): 逻辑或运算符,任何一个运算对象是真,结果就为真。只有当左侧运算对象为假时才会检查右侧运算对象。
| 运算符(| operator): 位或运算符,由两个运算对象生成一个新的整型值。如果两个运算对象对应的位至少由一个是1,所得结果中该位为1;否则所得结果中该位为0。
++ 运算符(++ operator): 递增运算符。包括两种形式:前置版本和后置版本。前置递增运算符得到一个左值,它给运算符加1并得到运算对象改变后的值。后置递增运算符得到一个右值,它给运算符加1并得到运算对象原始的,未改变的值的副本。注意:即使迭代器没有定义 + 运算符,也会有++运算符。
-- 运算符(-- operator): 递减运算符。包括两种形式:前置版本和后置版本。前置递减运算符得到一个左值,它从运算符减1并得到运算对象改变后的值。后置递减运算符得到一个优质,它从运算符减1并得到运算对象元素的,未改变的值或副本。注意:即使迭代器没有定义 --运算符,也会有 --运算符。
<< 运算符(<< operator): 左移运算符,将左侧运算对象的值的(可能是提升后的)副本向左移位,移动的位数有右侧运算对象确定。右侧运算对象必须大于等于0而且小于结果的位数。左侧运算对象应该是无符号类型,如果它是带符号类型,则一旦移动改变了符号位的值就会产生未定义的结果。
>> 运算符(>> operator): 右移运算符,除了移动方向相反,其他性质都和座椅运算符类似。如果左侧运算对象是带符号类型,那么根据实现的不同新移入的内容也不同,新移入的位可能都是0, 也可能都是符号位的副本。
~ 运算符(~ operator): 位求反运算符,生成一个新的整型值。该值的每一位恰好与(可能是提升后的)运算对象的对应位相反。
!运算符(!operator): 逻辑非运算符,将它的运算对象的布尔值取反。如果运算对象是假,则结果位真,如果运算对象是真,则结果为假。
<<C++ Primer>> 第四章 表达式的更多相关文章
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...
- C++Primer 第四章
//1.当我们对运算符进行重载的时候,其包括运算对象的类型和返回值的类型都是由该运算符定义的,但是运算对象的个数和优先级,结合律都是不能改变的 //2.当一个对象被用作右值的时候,用的是对象的值(内容 ...
- 重读金典------高质量C编程指南(林锐)-------第四章 表达式和基本语句
4.1 运算符的优先级 规则:如果代码行中的运算符比较多,可用括号确定操作顺序.if((a|b)&&(a&c)) 4.2 复合表达式 规则:不要编写太复杂的复合表达式 ...
- c++primer 第四章编程练习答案
4.13.1 #include<iostream> struct students { ]; ]; char grade; int age; }; int main() { using n ...
- 【C++】《C++ Primer 》第四章
第四章 表达式 一.基础 重载运算符:当运算符作用在类类型的运算对象时,用户可以自行定义其含义. 左值和右值: C中:左值可以在表达式左边,右值不能. C++中:当一个对象被用作右值的时候,用的是对象 ...
- 《C++Primer》第五版习题解答--第四章【学习笔记】
[C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...
- C Primer Plus_第四章_字符串和格式化输入输出_编程练习
Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...
- C++ Primer Plus学习:第十四章
第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...
- C++ Primer Plus学习:第四章
C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...
随机推荐
- shell中+,*,[:space:]的用法
http://blog.itpub.net/27181165/viewspace-1061688/ 在linux中通常会使用shell结合正则表达式来过滤字符,本文将以一个简单的例子来说明+,*,[: ...
- CGI中使用Cookie
在 http 协议一个很大的缺点就是不对用户身份的进行判断,这样给编程人员带来很大的不便, 而 cookie 功能的出现弥补了这个不足. cookie 就是在客户访问脚本的同时,通过客户的浏览器,在客 ...
- 通用DES加密解密方法
/// <summary> /// DES加密方法 /// </summary> /// <param name="strPlain">明文&l ...
- 【杂题】[CodeForces 1172F] Nauuo and Bug【数据结构】【线段树】
Description 给出一个长度为n的序列a和一个整数p 有m组询问,每组询问给出一个区间\([l,r]\) 你需要给出下面这个过程的结果 ans = 0 for i from l to r { ...
- HEOI2016/TJOI2016 字符串问题
题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. 40pts暴力:直接暴力匹配 #include<iostream> #include<cstrin ...
- mybatis invalid bound statement (not found)
Spring boot + Mybatis : Invalid bound statement (not found) 如果只在启动类上配置@MapperScan注解,默认只扫描和mapper接口同名 ...
- HDU 6155 Subsequence Count (DP、线性代数、线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6155 题解 DP+线代好题.(考场上过多时间刚前两题,没怎么想这题--) 首先列出一个DP式: 设\( ...
- [LOJ3120][CTS2019|CTSC2019]珍珠:生成函数+NTT
分析 容易发现\(D \leq n - 2m\)时,任意数列都满足要求,直接判掉,下文所讨论的均为\(D > n - 2m\)的情况. 考虑把两个数列合并,显然可以认为是两个带标号对象的合并,可 ...
- JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法
当session会话超时,页面请求被重新定位到了登陆界面.但登录界面在iframe中的解决方案:在登录页面中加入下面的js代码: <script type="text/javascri ...
- 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)
注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...