C++关于运算符的注意事项
1、函数调用也是一种特殊的运算符,对运算对象的个数不作限制。
2、几元运算符,是基于作用的对象的数量。
3、不同类型的运算对象进行运算,可能会出现类型转换,一般情况下小整数类型会被转换成较大的整数类型,当然,还可能有其他情况的类型。
4、重载运算符的优先级和结合律是无法改变的,但是可以改变运算对象的类型和返回值的类型。
5、当一个对象被用作右值时,那么用的是这个对象的值(内容),当这个对象被用作左值时,用的是这个对象在内存中的地址。
6、在一个需要右值的地方可以使用左值代替,但是不能用右值去替代左值使用。
7、取地址一个运算对象,返回的是指向它的指针。这个指针是右值。
8、使用decltype时,如果表达式中的值是左值的话,推断出来的类型是引用类型。
9、算术运算符满足左结合律,当优先级相同时,从左到右结合。
10、对于没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将引发错误并产生未定义的行为。就是说这些运算符对象,不能相互有影响或者有IO任务,在同一个表达式中。否则其行为未定义。
11、如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。当且仅当所改变的运算对象的子表达式的本身,就是另一个子表达式的运算对象时无效。简单的说,就是当两个运算符共用一个同一个运算对象时并且有优先级顺序时,无效。
12、除非另做特殊说明,凡是算术运算符,都能够作用于任意的算术类型,或者能够转换成算术类型的类型。
13、当一个一元正号运算符或者一元负号运算符作用于一个指针或者算术值时,返回运算的对象值的一个副本(提升后)。
14、算术表达式出现未定义的结果,有两方面的原因:一方面是,数学性质,例如除数不为0;另一方面是,计算机本身的特点,例如溢出,计算的结果超出了类型所能表示的范围。
15、参与取余或取模运算的运算对象必须是整数类型,进行除法运算时,如果运算对象的符号不同,则商为负值,早期C++支持负值的商向上或者向下取整,C++11新标准下,商一律向0取整(即舍弃掉小数部分)。
16、早期的C++,允许m%n的符号匹配n的符号,并且商的值向负无穷一侧取整,但是新标准下的是禁止的。除非是-m导致溢出的情况,不然(-m)/n,m/(-n),其值都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)。也就是说对于/运算符,任意其中一个运算对象的值为负,都等于整个正的运算对象求值取负号,而对于%运算符,只有对m取负,才等于整个正的运算对象求值取负号。
17、算术表达式不应该参与布尔运算。并且它的结果是右值。
18、关系运算符作用于算术类型或者指针类型,逻辑运算符作用于任意能转换成布尔值的类型。其中逻辑非优先级大于关系运算符(比较大小的运算符>=等运算符优先级大于判断是否相等的关系运算符)大于其他逻辑运算符。
19、所谓短路求值,是指当左侧运算对象无法确定整个表达式的值时,才对右侧表达式进行计算。
20、如果想测试一个算术对象或者指针的真值,最直接的方法就是让它作为if语句的条件。在进行比较时,如果比较的对象是布尔型时才去使用布尔字面值作为运算对象,否则不要使用。
21、赋值运算符的左侧运算对象如果是内置类型,那么初始值列表最多只能一个值,如果类型不同,那么发生转换的话,转换后值的大小也不应该超过目标类型的空间大小。如果左侧对象是类类型,则根据其自身类的定义决定。
22、无论左侧运算对象的类型是什么,初始值列表都可以为空,编译器会提供一个值初始化的临时量去初始化。
23、赋值运算符满足的是右结合律,所以先计算右边对象或者表达式的值。赋值运算符优先级次低的仅高于逗号运算符。
24、a op=b;等价于a=a op b; 前者a的值计算一次,而后者计算两次,一次是作为右边子表达式的一部分求值,另一部分是作为左边对象求值。除了对程序性能有影响,其他的没有多大影响。
25、递增、递减运算符的前置形式和后置形式作用的对象都是左值运算对象,前置版本将对象本身作为左值返回,后置版本将对象原始值作为副本拷贝一份作为右值返回,然后其本身再递增递减。尽量使用前置版本。
26、点运算符和箭头运算符作用是一样的,都是用来访问类对象的成员,区别在于(*ptr).mem和ptr->mem,这是由于解引用的运算符优先级低于点运算符,而且箭头运算符结果是一个右值,而点运算符的结果是根据其成员所属的对象是左值还是右值,若是左值结果就为左值,若为右值,结果就是右值。就是说因为指针所指的对象一定是一个左值,所以使用->返回的成员也一定是左值。而对右值对象调用成员调用运算符(.)是合法行为,但是这个被调用的成员在对象被销毁时也一并被销毁,所以整个成员也是右值。
27、条件运算符的表达式如果是左值或者可以在转换成同一种左值类型时,运算的结果就是左值,否则运算的结果就是右值。并且条件运算符的表达式必须是同一种类型或者可以转换成同一种类型的。
28、条件运算符可以作为另外的条件运算符的cond或者expr,条件运算符满足右结合律,一般情况下是从右向左的顺序进行结合,典型的就是嵌套条件运算符,先结合其靠右的条件运算符构成分支。
30、嵌套条件运算符如果嵌套过多会让程序的可读性降低,所以不要嵌套过多层的条件运算符。
31、由于条件运算符的优先级极低,所以若要在输出中使用条件运算符,那么需要对其加括号提高运算优先级。
32、位运算符是作用于整数类型的运算对象,并且把运算对象看成二进制的集合。如果运算对象是小整型,那么其值会被自动提升成较大的整型。《C++ primer fifth》中强烈建议我们将位运算符用于处理符号类型。
33、移位运算符<<和>>,与标准IO库的输入输出一样,只不过后者是前者的重载之后的,内置类型的<<和>>是对其运算对象执行基于二进制位的移动操作。左侧运算对象根据右侧运算对象移动指定的位数,并且将左侧运算对象的值拷贝一份作为求值结果。
35、移位时右侧运算对象的值不能是负数,并且值必须是小于结果的位数。二进制的移位,移出了边界的位就被舍弃了。
C++关于运算符的注意事项的更多相关文章
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- java中数据类型及运算符的注意事项
数据类型: boolean 类型数据只允许取值true 或 false(不可以使用0 或非0的整数来代替true和false,区分于C语言). char:Java中用" \u四位十六进制的数 ...
- C语言基础之自增自减运算符及注意事项
1.具体用法 1: int b; 2: int a = 10; 3: // b = 10 + 12; 4: //b = (a++) + (++a); 5: 6: // b = 11 + 11; 7: ...
- 玩转C++运算符重载
运算符重载语法:返回值类型 operator运算符(参数列表) { 代码逻辑... } C++中的运算符重载是通过函数来实现的,可以将重载的运算符看作是类成的一个成员函数,向普通函数一样调用.如重 ...
- java笔记2之算术运算符
1运算符是什么呢 对常量和变量进行操作的运算符 2运算符分为哪些 算术运算符(+,-,*,/), 赋值运算符 比较运算符 逻辑运算符 位运算符 三目运算符 3运算符 A 算术运算符的注意事项 (1)整 ...
- Java 基础入门随笔(3) JavaSE版——逻辑运算符、位运算符
上一节写了一些运算符的注意事项,这节开头依然是对运算符的一些注意点的阐述! 比较运算符除了>.>=.<.<=.==.!=之外需要注意instanceof:检查是否是类的对象,例 ...
- 实例讲解react+react-router+redux
前言 总括: 本文采用react+redux+react-router+less+es6+webpack,以实现一个简易备忘录(todolist)为例尽可能全面的讲述使用react全家桶实现一个完整应 ...
- 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符
02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...
- JavaEE基础(二)
1.Java语言基础(常量的概述和使用) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常量 用 ...
随机推荐
- Python全栈开发-Day6-面向对象编程
本节内容: 面向过程VS面向对象 面向对象编程介绍 类的语法 构造函数.析构函数 私有方法.私有属性 面向对象的特性:封装.继承.多态 1.面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法 ...
- Axure 全局变量公式的使用和局部变量
全局变量和全部变量的公式: 1.全局变量在当前用例所有的动作里面都有,都可以设置 2.全局变量的公式在中括号里面的变量可以运算,但是在中括号外面的变量只是起到连接的作用 局部变量: 局部变量只可以在当 ...
- js时间戳如何转时间
js时间戳如何转时间 一.总结 一句话总结:Date对象分别获取年now.getFullYear()月now.getMonth()+1日now.getDate()即可 Date对象分别获取年now.g ...
- hibernate例子
首先下载好hibernate包 如果运行之后出现数据库连接错误 则重新把jar包位置放在web-inf的lib下面再addbulidpath 第一步:创建实体类 Hibernate要求实体类必须提供 ...
- 图片路径转base64字节码
package product; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOE ...
- putty 显示 ubuntu的文件乱码
http://www.linuxidc.com/Linux/2012-01/52252.htm 下面几个注意点 1) Windows - Appearance - Font settings 里可以更 ...
- MyEclipse下自定义(支持html5的)JSP模板--JSP
需求:由于某些Mclipse版本发行的比较早,所以在有些版本(比如Mclipse2014,至于其他版本博主不知能不能创建html5格式的JSP页面)里创建JSP页面时html部分不是html5格式的. ...
- 2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)
觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活. 2019/01/17 基于windows使用fab ...
- python记录_day23 正则表达式 re模块
一. 正则表达式 使用python的re模块之前应该对正则表达式有一定的了解 正则表达式是对字符串操作的一种逻辑公式.我们一般使用正则表达式对字符串进行匹配和过滤. 正则的优缺点: 优点:灵活, 功能 ...
- MRBS开源会议室预订系统安装
MRBS系统官方网址 https://mrbs.sourceforge.io/ 最近在找一份开源的会议室预订系统,找了很多种,ASP,PHP的,测试发现MRBS无疑是最好的.开源社区对其介绍如下:M ...