C++篇:第二章_运算符_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
二、运算符
(一)运算符本身运用限制
%取余运算符要求运算数必须是整型,浮点数取余用fmod(x,y),若不符则会发生编译错误
加加运算符并不会提高运行时效率,反而会降低,只是为了代码更精简
按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用
在一个式子中如果有两个以上同一优先级的运算符,其运算次序是按运算符的结合性(自右向左和自左向右)来处理
5.不能用于浮点数的运算符:
① 求余数% 和%=
② 下标[]
③ 所有的位运算符:& | ^ ~ << >>,还有&= | = ^= <<= >>=
- 在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9
(二)运算符运用
三目运算符从右到左运算
(3,2,1,0) 可作为C++合法表达式,这是一个逗号表达式
sizeof(double) 是一个整型表达式 // sizeof是运算符,不是函数,sizeof的结果是无符号整数,可以把它看作是无符号整型表达式
sizeof是运算符,在编译时即计算好了,在头文件中typedef为unsigned int,参数可以是数组、指针、类型、对象、函数等
strlen是函数,要在运行时才能计算。参数必须是字符型指针。当数组名作为参数传入时,实际上数组就退化成指针了
a与0xf(十进制即15)做异或操作,可以实现低四位的翻转。
如果是| 按位或 ,则将低四位数全变成1.
如果是& 按位与,则结果不变。(3++)++4 = 35 = 15 // 3++返回的是3
运算符“>>”执行算术右移,每移一位,第一个操作数被2除一次;按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
运算符“<<”执行算术左移,在数字没有溢出的前提下,对于正数和负数,左移一位都 相当于乘以2的1次方,左移n位就相当于乘以2的n次方;按二进制形式把所有的数 字向左移动对应的位数,高位移出(舍弃),低位的空位补零
逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充 左侧的空位。
算术右移不改变原数的符号,而逻辑右移不能保证这点。
移位运算符约简其右侧的操作数,当左侧操作数是int类型时,右侧以32取模;当左侧是long类型时,右侧以64取模
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=10都不是逻辑运算)
C++支持连等的情况只有变量在前面已定义的背景下才支持,故int a = b = 7; //错误,因为只是定义了a,没定义b(结合笔记的赋值表达式)
逻辑表达式的返回值是0,1
x&(x-1)统计1的个数,x|(x+1)统计0的个数
因为i++在计算时,会用到中间变量存储,会占用更多的内存和时间。所以++i更好
(三)运算符重载
1.运算符重载的规则:
① 只能重载已有的且被允许重载的运算符。
② 重载之后,运算符的优先级和结合性不会改变,也不能够改变。
③ 重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时重载运算符必须具有一个类对象(或类对象的引用)的参数
④ 运算符重载函数不能使用默认参数
⑤ 成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、三目条件运算符“?:”不能重载
⑥ 赋值运算符“=”,下标运算符“[]”,函数调用运算符“()”,成员运算符“->”必须作为成员函数重载
⑦ 流插入和流提取运算符,类型转换运算符函数只能作为友元函数
⑧ 在自增自减运算符重载函数中,增加一个int型形参,就是后置了
operator写在返回类型后运算符号前,故运算符函数的函数名就是“operator运算符号”
一般运算结果作为左值则返回引用类型,作为右值则返回对象
如果运算符左侧的操作数属于C++标准类型或是一个其他类的对象(非本类时),则运算符重载函数只能作为非成员函数
5.运算符重载为类的成员函数:
① 运算符函数的形式参数个数比运算符规定的运算对象个数要少一个
② 双目运算符重载为类的成员函数形参个数为1个(const 所属类型 &obj)
③ 前置单目运算符重载为类的成员函数形参个数为0
④ 后置单目运算符重载为类的成员函数形参个数为1(如int)
⑤ 当运算符重载为友元函数时,运算符函数的形参个数和运算符规定的运算对象个数一致
(1) 双目形参为(const 所属类型 &obj1,const 所属类型 &obj2)
(2) 前置单目形参为(const 所属类型 &obj)
(3) 后置单目形参为(const 所属类型 &obj,int)
6. 典型运算符的重载:
① 复合的赋值运算符重载:因为具有“给运算对象重新赋值”的功能,运算符函数需要返回引用类型
② 重载流运算符:运算符函数返回流对象的引用类型,且流插入和提取重载函数不能是类的成员函数
③ 重载类型转换运算符(将类类型显示的转换为其他数据类型):只能作为类的成员函数
C++篇:第二章_运算符_知识点大全的更多相关文章
- Java语言程序设计(基础篇)第二章
第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...
- 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件
作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...
- Java编程基础篇第二章
关键字 概述:被Java语言赋予特定含义的单词. 特点:组成关键字的字母全部为小写字母. 标识符 概述:给类,接口,包,方法,常量起名字时的字符序列 组成规则:英文大小写字母,数字,$和— 命名规则. ...
- 嵌入式学习笔记(综合提高篇 第二章) -- FreeRTOS的移植和应用
1.1 资料准备和分析 上章节通过实现双机通讯,了解如何设计和实现自定义协议,不过对于嵌入式系统来说,当然不仅仅包含协议,还有其它很多需要深入学习了解的知识,下面将列出我在工作和学习上遇到的嵌入 ...
- 明解C语言 入门篇 第二章答案
练习2-1 #include <stdio.h> int main() { int x; int y; int percent; puts("请输入两个整数"); pr ...
- 网络安全-主动信息收集篇第二章SNMP扫描
SNMP扫描: snmp在中大型企业中可以用来做网络管理和网络监控的使用,当开启了snmp简单网络管理后,那么客户机就可以通过这个协议向该设备发送snmp协议内容可以轻松查询到目标主机的相关信息. 以 ...
- 网络安全-主动信息收集篇第二章-三层网络发现之nmap和fping和Hping
nmap IP -sn nmap当目标IP在同一网段时,nmap会发送ARP包,当目标IP不在同一网段时nmap会发送ICMP的包. fping IP fping -g 参数支持对IP地址起始和结 ...
- 网络安全-主动信息收集篇第二章-三层网络发现之ping
第三层网络扫描基于TCP/IP.ICMP协议. 优点:可路由.速度比较快 缺点:相对于二层网络扫描较慢,容易被边界防火墙过滤 所有扫描发现技术,都会有相应的对抗办法,所以无论是来自二层的网络扫描还是来 ...
- 网络安全-主动信息收集篇第二章-二层网络扫描之scapy
scapy是python第三方库文件,可以使用python进行调用也单独进行使用. 非常强大可以用于抓包.分析.创建.修改.注入网络流量. 使用scapy 详细使用方式可以查看github:https ...
- 网络安全-主动信息收集篇第二章-二层网络扫描之Netdiscover
专用于二层发现 可用于无限和交换网络环境 主动和被动探测 主动模式:netdiscover –i 网卡名 –r IP/网络位 / netdiscover –l IPList.txt 被动 net ...
随机推荐
- Java虚拟机(JVM):第三幕:自动内存管理 - 垃圾收集器与内存分配策略
前言:Java与C++之间有一堵高墙,主要是有内存动态分配和垃圾收集技术组成的.墙外的人想要进来,墙内的人想要出去. 一.概述 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的.内存的分配和 ...
- 【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户名示例
问题描述 在App Service上放置一个JS页面并引用msal.min.js,目的是获取AAD用户名并展示. 问题解答 示例代码 <!DOCTYPE html> <html> ...
- 【译】为什么命名“它”为依赖属性(DependencyProperty)
当我们创建新的类和成员时,我们花费了大量的时间和精力是它们尽可能的好用,好理解,好发现.通常我们会遵循.Net框架设计指南,尤其是会不断地研究这个新类与其他类,未来计划等内容之间的关系. 当命名依赖属 ...
- centos服务器搭建https
一.环境 OS:CentOS Linux release 8.2.2004 (Core) 硬件:某外网云服务器虚拟机 二.安装命令 1.安装nginx yum install nginx 2.安装签发 ...
- Xmind思维导图工具2023最新专业版破解思路
工具介绍 XMind 是一款最为流行的专业级思维_导图_制作与编辑软件,它现在在全球范围内都已极具名气,可谓是办公.学习.团队交流必备工具之一. 准备工作 1,官方Xmind软件 2,一个心意的编辑器 ...
- Opencv学习笔记(1)
1.安装环境 如何安装Python解释器和PyCharm,这里就不说明了, 参考文章链接:https://blog.csdn.net/weixin_72959097/article/details/1 ...
- MATLAB时间序列数据重建与平滑:HANTS滤波
本文介绍在MATLAB中,实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪.重建.填补的详细方法. HANTS(Harmonic Analysis of Time Series ...
- Hive数据库数据表元数据导出脚本
表结构导出 ## @Title Hive库表元数据导出脚本 ## @Author changxy #!/bin/bash ##############注意修改Hive连接信息############# ...
- 如何在 PyQt 中实现异步数据库请求
需求 开发软件的时候不可避免要和数据库发生交互,但是有些 SQL 请求非常耗时,如果在主线程中发送请求,可能会造成界面卡顿.这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单,且不会 ...
- linux笔记一(基础命令)
总结: 1.ls – List ls会列举出当前工作目录的内容(文件或文件夹),就跟你在GUI中打开一个文件夹去看里面的内容一样. 2.mkdir – Make Directory mkdir 用 ...