操作数

C/C++对运算符重载详解

余生颓废 提交于 2020-01-14 12:27:12
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <( const node &a) const { //重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10

无人久伴 提交于 2020-01-13 09:01:14
一、段描述符的分类 在上一篇博文中已经说过,为了使用段,我们必须要创建段描述符。80X86中有各种各样的段描述符,下图展示了它们的分类。 看了上图,你也许会说:天啊,怎么这么多段描述符啊!我可怎么记住呢? 别担心,我会在以后的博文中,跟随原书的作者,为您逐步介绍。我们的学习是循序渐进的,所以不要求一下子掌握所有东西。我们的原则是:用到什么学什么。我们今天的重点是“存储段描述符”。 二、段描述符的通用格式 [1] 段描述符是GDT和LDT中的一个数据结构项,用于向处理器提供有关一个段的位置、大小以及访问控制的状态信息。每个段描述符的长度是8个字节,含有3个主要字段: 段基地址 段限长 段属性 段描述符通常由编译器,链接器,加载器或者操作系统来创建,但绝不是应用程序。 下图给出了所有类型的段描述符的一般形式。 1.段限长字段Limit 用于指定段的长度。处理器会把段描述符中两个段限长字段组合成一个20位的值,并根据颗粒度标志G来指定段限长Limit值的实际含义。 如果G=0,则Limit值的单位是B,也就是说Limit的范围可以是1B到1MB; 如果G=1,则Limit值的单位是4KB,也就是说Limit的范围可以是4KB到4GB。 根据段类型字段TYPE中的段扩展方向标志E,处理器可以以两种不同的方式使用Limit。 E=0:表示向上扩展的段(简称上扩段)

前缀、中缀、后缀表达式

守給你的承諾、 提交于 2020-01-13 02:23:09
它们 都 是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式 的运算符位于与其相 关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 一、中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。 中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。 对计算机来说,计算前缀或后缀表达式的值非常简单。 二、前缀表达式(前缀记法、波兰式) 前缀表达式的 运算符位于两个相应操作数之前。 前缀表达式的计算机求值:(相当于转换成了中缀表达式) 从右至左扫描表达式 ,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 例如前缀表达式“- × + 3 4 5 6”: (1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素

前缀、中缀、后缀表达式以及简单计算器的C++实现

两盒软妹~` 提交于 2020-01-12 13:46:24
前缀表达式(波兰表达式)、中缀表达式、后缀表达式(逆波兰表达式) 介绍   三种表达式都是 四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解。 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间。 后缀表达式 后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 中缀表达式转前缀表达式   例如:对于中缀表达式 (3+4)×5-6 ,其前缀表达式为 - × + 3 4 5 6 。前后缀表达式与中缀之间的转换关系,不在此赘述,在 Seraphjin 的博客中,通过二叉树的方式,很好地解释了这一内容。 除了该博客中所说的二叉树法,还可以通过栈方法,来实现二者的转换,具体步骤如下: 初始化两个栈:运算符栈S1和储存中间结果的栈S2; 从右至左扫描中缀表达式; 遇到操作数时,将其压入S2; 遇到运算符时,比较其与S1栈顶运算符的优先级: 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; 否则

C语言复习2

时光怂恿深爱的人放手 提交于 2020-01-12 07:36:01
/*--> */ /*--> */ 4 、 atoi() atol atof () 实现 一、atoi函数(将字符串转换成整型数) 函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。 二、itoa(把一整数转换为字符串 ) itoa(num,str,10); num:整数 str保存位置 10:以十进制转换 三、atof(将字符串转换成浮点型数) 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转 换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。返回值 返回转换后的浮点型数 四、atol(将字符串转换成长整型数) 函数说明 atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。 返回值 返回转换后的长整型数。 5 、移位操作 >> << >>= <<=    位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符

深入理解计算机系统(3.4)------算术和逻辑操作

微笑、不失礼 提交于 2020-01-11 23:48:03
上一篇博客 我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算指令,算术无非就是加减乘除,而逻辑运算也就是与或非,移位等操作。下面这张图是汇编里面的算术和逻辑操作:      上面除了 leal(加载有效地址)指令通常用来执行简单的算术操作,其余的指令都是标准的一元或者二元操作,下面我们分别来介绍这几个指令操作。 1、leal 指令   leal 指令也称为加载有效地址(load effective address)指令,它实际上是 movl 指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本没有引用存储器。   它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读取数据,而是将有效地址写入到目的操作数,类似于 C 语言的取地址操作符“&”。另外就是作普通的算术运算。   leal 立即数,寄存器   这类指令就是将立即数装载至寄存器,比如 leal $0x01,%eax 这种情况下 和 movl $0x01,%eax 的效果是等价的    leal 地址,寄存器   leal指令的作用是将地址加载到寄存器,对于leal S,D而言,就是实现了 &S –> D 的功能    leal S, D 结果是&S -> D   movl S,D 结果是S -> D   

负数取模

家住魔仙堡 提交于 2020-01-11 23:30:18
本文转载于: http://blog.sina.com.cn/s/blog_6f5c63ff0100tucb.html 我们知道,在不同的语言中,对负数执行取模运算,结果有可能会是不同的。例如,(-11)%5在python中计算的结果是4,而在C(C99)中计算的结果则是-1。 truncate除法 && floor除法 在大多数编程语言中,如果整数a不是整数b的整数倍数的话,那么a、b做除法产生的实际结果的小数部分将会被截除,这个过程称为截尾(truncation)。如果除法的结果是正数的话,那么一般的编程语言都会把结果趋零截尾,也就是说,直接把商的小数部分去除。但是如果除法的结果是负数的话,不同的语言通常采用了两种不同的截尾方法:一种是趋零截尾(truncate toward zero),另一种是趋负无穷截尾(truncate toward negative infinity);相应的,两种除法分别被称为truncate除法和floor除法。事实上,可以认为不管除法的结果是正是负,truncate除法都是趋零结尾;而floor除法都是趋负无穷结尾。 取模运算 取模运算实际上是计算两数相除以后的余数。假设q是a、b相除产生的商(quotient),r是相应的余数(remainder),那么在几乎所有的计算系统中,都满足a=b*q+r,其中|r|<|a|。因此r有两个选择,一个为正

第16课 位运算符分析

偶尔善良 提交于 2020-01-11 20:46:28
1. C 语言中的位运算符——直接对bit位进行操作,效率最高 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 2. 左移和右移注意点 (1)左 操作数 必须为整型类型:char和short被隐式转换为int后进行移位操作 (2)右 操作数 的范围必须为: [0,31]。其他值属未定义行为,不同编译器处理不同。 (3)左移 运算符 << 将运算数的二进制位左移:规则为高位丢弃, 低位补0 (4)右移 运算符 >> 把运算数的二进制位左移:规则为 高位补符号 ,低位丢弃 3. 有趣的问题:0x1 << 2 + 3 的值会是什么? 【实例分析】位运算符初探 #include <stdio.h> int main() { printf("%d\n", 3 << 2); //3<<2 ===> 0x11<<2 ===>1100,即12 printf("%d\n", 3 >> 1); //0x11<<1, 即1 printf("%d\n", -1 >> 1);//0x1111>>1 ,即0x1111,仍为1 printf("%d\n", 0x01 << 2 + 3);//相当于0x01<<(2+3),即32 printf("%d\n", 3 << -1); // oops!右操作数必须为[0,31],不同编译器处理方式不同 return 0; } 4. 小贴士—

python除法运算

 ̄綄美尐妖づ 提交于 2020-01-11 09:10:31
1.除法运算 1.1 有一个操作数为负数 被除数到除数的距离整除除数,得到的数字加上符号便得到结果。 例如:-27/10 -27到10的距离为37,37/10 = 3,于是-3便是表达式的结果。 27/-10 27到-10的距离为37,37/10 = 3,于是-3便是表达式的结果。 1.2 操作数全为正数(略) 1.3 操作数全为负数(略) 2. 取模运算 2.1 操作数全为正整数 X和Y均为正整数 X/Y的结果为Z 则X%Y = X-(X*Z) 例如: 2.2 有一个操作数为负数 X和Y均为有一个为负整数,一个为正整数 X/Y结果的绝对值为Z, 则X%Y 的结果是 |X| -(|Y| * Z),符号位和Y相同。 例如: 26%-20 26/-20 = -2,故Z = 2; |26| -(|-20| * 2) = 26 -40 = -14 由于除数Y为-20,故 26%-20 = -14 -26%20 -26/20 = -2,故Z = 2; |-26| -(|20| * 2) = 26 -40 = -14 由于除数Y为20,故 -26%20 = 14 2.3 两个操作数都为负数 值的大小和两个操作数绝对值取模的结果相同,不过符号相反。 总结:除法中商的正负由两个操作数共同决定,相同为正,相异为负。 取模运算,结果的符号由第二个操作数的符号决定。 来源: https://www

【金三银四】JVM虚拟机栈执行原理深入详解

僤鯓⒐⒋嵵緔 提交于 2020-01-11 04:03:48
前言: 你好,早上、中午、下午、晚上好。我是Java2B哥(微信搜Java2B)。一名无缘985,日常996工程师。 你们是不是非常的激动呀! 2B哥今天继续教大家JVM知识。这次章节为: 【金三银四-JVM系列】CMS收集器与GC日志分析定位问题详解 【金三银四】JVM虚拟机CMS和G1收集器详解 什么是JVM 相信很多小伙伴都非常熟悉了,JVM不就是虚拟机吗?那虚拟机又是什么了?不是JVM嘛! 这不废话嘛。 JVM可以说离我们既熟悉又陌生,很多朋友可能在工作中接触不到这块技术,但是在面试往往被问到(概率还蛮大),被问到了自认倒霉,死记硬背是没用的,到头来还是的忘,不过没有关系,今天你们遇到2B哥我,我这免费给大家说道说道JVM知识点,我要没让你明白算我输,你可以留言喷我,如果要是可以,你们也给我点个赞成不?别墨迹了 赶紧着吧。 ok,上货。此处应该有鲜花!❀❀❀❀❀❀❀❀ 初识JVM: 相信这张图大家都不陌生,这是整个Java体系,其中包括JDK.JRE.JVM三者的关系。 图中可以看得出来JRE包含了JVM,JDK包含了JRE。 从包含的角度就是: JDK是爷爷 JRE是父亲 JVM是儿子(如果觉得列子不太恰当)来看图 我们来看代码: public class App { private String name; private Object object = new