编程语言
首页 > 编程语言> > C++篇:第二章_运算符_知识点大全

C++篇:第二章_运算符_知识点大全

作者:互联网

二、运算符

(一)运算符本身运用限制

  1. %取余运算符要求运算数必须是整型,浮点数取余用fmod(x,y),若不符则会发生编译错误

  2. 加加运算符并不会提高运行时效率,反而会降低,只是为了代码更精简

  3. 按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用

  4. 在一个式子中如果有两个以上同一优先级的运算符,其运算次序是按运算符的结合性(自右向左和自左向右)来处理

5.不能用于浮点数的运算符:

① 求余数% 和%=

② 下标[]

③ 所有的位运算符:& | ^ ~ << >>,还有&= | = ^= <<= >>=

  1. 在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9

(二)运算符运用

  1. 三目运算符从右到左运算

  2. (3,2,1,0) 可作为C++合法表达式,这是一个逗号表达式

  3. sizeof(double) 是一个整型表达式 // sizeof是运算符,不是函数,sizeof的结果是无符号整数,可以把它看作是无符号整型表达式

  4. sizeof是运算符,在编译时即计算好了,在头文件中typedef为unsigned int,参数可以是数组、指针、类型、对象、函数等

  5. strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了

  6. a与0xf(十进制即15)做异或操作,可以实现低四位的翻转。

  7. 如果是| 按位或 ,则将低四位数全变成1.
    如果是& 按位与,则结果不变。

  8. (3++)++4 = 35 = 15 // 3++返回的是3

  9. 运算符“>>”执行算术右移,每移一位,第一个操作数被2除一次;按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。

​ 运算符“<<”执行算术左移,在数字没有溢出的前提下,对于正数和负数,左移一位都 相当于乘以2的1次方,左移n位就相当于乘以2的n次方;按二进制形式把所有的数 字向左移动对应的位数,高位移出(舍弃),低位的空位补零

逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充 左侧的空位。

​ 算术右移不改变原数的符号,而逻辑右移不能保证这点。

  1. 移位运算符约简其右侧的操作数,当左侧操作数是int类型时,右侧以32取模;当左侧是long类型时,右侧以64取模

  2. Int i=1,~i=-2 //C++中非表示为!

因为假设int占2个字节,那么1的二进制表示是 0000 0001 ,~表示按位取反,则 0000 0001变为 1111 1110(为负数),在计算机中整数用补码形式表示,正数的补码是它 本身,负数的补码是原数值除符号位按位取反再加一,由补码求原数值也是按位取反再 加一,那么 1111 1110 除符号位按位取反再加一变成 1000 0010,即 -2(取反后若为 负数则还要按位取反再加一求出原数值)

  1. 1+1=1 // 为二进制的逻辑运算,真且真=真(故1/1、1-1、1+1=10都不是逻辑运算)

  2. C++支持连等的情况只有变量在前面已定义的背景下才支持,故int a = b = 7; //错误,因为只是定义了a,没定义b(结合笔记的赋值表达式)

  3. 逻辑表达式的返回值是0,1

  4. x&(x-1)统计1的个数,x|(x+1)统计0的个数

  5. 因为i++在计算时,会用到中间变量存储,会占用更多的内存和时间。所以++i更好

(三)运算符重载

1.运算符重载的规则:

① 只能重载已有的且被允许重载的运算符。

② 重载之后,运算符的优先级和结合性不会改变,也不能够改变。

③ 重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时重载运算符必须具有一个类对象(或类对象的引用)的参数

④ 运算符重载函数不能使用默认参数

⑤ 成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、三目条件运算符“?:”不能重载

⑥ 赋值运算符“=”,下标运算符“[]”,函数调用运算符“()”,成员运算符“->”必须作为成员函数重载

⑦ 流插入和流提取运算符,类型转换运算符函数只能作为友元函数

⑧ 在自增自减运算符重载函数中,增加一个int型形参,就是后置了

  1. operator写在返回类型后运算符号前,故运算符函数的函数名就是“operator运算符号”

  2. 一般运算结果作为左值则返回引用类型,作为右值则返回对象

  3. 如果运算符左侧的操作数属于C++标准类型或是一个其他类的对象(非本类时),则运算符重载函数只能作为非成员函数

​ 5.运算符重载为类的成员函数:

① 运算符函数的形式参数个数比运算符规定的运算对象个数要少一个

② 双目运算符重载为类的成员函数形参个数为1个(const 所属类型 &obj)

③ 前置单目运算符重载为类的成员函数形参个数为0

④ 后置单目运算符重载为类的成员函数形参个数为1(如int)

⑤ 当运算符重载为友元函数时,运算符函数的形参个数和运算符规定的运算对象个数一致

(1) 双目形参为(const 所属类型 &obj1,const 所属类型 &obj2)

(2) 前置单目形参为(const 所属类型 &obj)

(3) 后置单目形参为(const 所属类型 &obj,int)

6. 典型运算符的重载:

① 复合的赋值运算符重载:因为具有“给运算对象重新赋值”的功能,运算符函数需要返回引用类型

② 重载流运算符:运算符函数返回流对象的引用类型,且流插入和提取重载函数不能是类的成员函数

③ 重载类型转换运算符(将类类型显示的转换为其他数据类型):只能作为类的成员函数

标签:知识点,函数,个数,C++,运算符,按位,重载
来源: https://www.cnblogs.com/oten/p/16124469.html