4.1  Fundamentals

1.Basic Concepts

(1)操作符分为一元,二元或者三元操作符;

(2)复杂的表达式中含有很多操作符时:

规则一:分为不同的级别,级别高的先运行;

规则二:相同级别的操作符有执行顺序的确定;

(3)操作符可以改变操作数的类型

一般将级别低的转化成级别高的

(4)重载运算符

相同的运算符在对不同类型的对象进行操作的时候,会有不同的功能;

(5)Lvalue和Rvalue

显而易见:Lvalue指的是Left value,Rvalue指的是Right value;所谓的Lvalue简单的来说就是可以放在‘=’左边的value,而Rvalue则是不能放在‘=’左边的value。实际上Lvalue就是持续暂用内存的value,即是使用它所在的内存,而Rvalue则是使用其内容,就是值,而不是用其所占有的内存空间。

4.2   Arithmetic Operators

Table:       Arithmetic Operators(Left   Associative)  
Operator Function Use
+ unary puls + expr
- unary minus - expr
     
* multiplication expr * expr
/ division expr / expr
% remainder expr % expr
     
+ addition expr + expr
- subtraction expr - expr

1、分析

(1)优先级

这些就是代数相关的操作符。然后等级有三个,正负号最高,然后是乘除,然后再是加减;统一级别的操作符按照从左到右的顺序进行计算。

(2)操作数

这些操作符基本上能对几乎所有的数据类型进行操作,但是在对不支持的类型进行操作的时候,往往会将类型往高级的转换。

e.g bool型变量

bool b = true;
bool b2 = -b; // b2 is true;

这是由于bool型变量没有相应的‘-’运算,所以在计算的过程将bool转化成了int,再进行计算,最后赋值的时候还有转化为bool型,-1转化为bool型依然是true,所以在进行操作符运算时,要留心那些变量的类型。

(3)一些新规则

(-m)/n    equal to   m/(-n)     equal to     -(m/n)

m%(-n)         equal to         m%n

(-m)%n         equal to         -m%n

4.3  Logical and Relational Operators

Table 4.2:Logical and Relational Operators
Associativity Operator Function Use
Right ! logical NOT !expr
       
Left < less than expr < expr
Left <= less than or equal expr <= expr
Left > greater than expr > expr
Left >= greater than of equla expr >= expr
       
Left == equality expr == expr
Left != inequality expr != expr
       
Left && logical AND expr && expr
Left || logical OR expr || expr

1、Logical AND and OR Operators

AND就是两者都成立则为真,OR则是有一个成立就为真

PS:重点在于逻辑短路

就是说在使用AND和OR操作符的时候,其顺序是从左往右,如果左边的可以确定AND 和 OR 的真假的时候,右边的操作就不需要进行。

e.g   如果 && 左边的值是false,那么无论右边是真是假都是false,所以右边的表达式不再计算

如果 || 左边的值是ture,那么无论右边是真是假都是true,所以右边的表达式不再计算

2、Logical NOT Operator

就是真的变成假的,假的变成真的。

3、The Relational Operators

关系运算符,如果是真的就返回true,否则就返回false

4、bool转换成其他类型时:true 转换成 1 ,false转化成 0

其他类型转化成bool型时,非0数转换成 true,0 则转换成false;

4.4 Assignment Operators

1、注意点:

(1)赋值操作符的左侧一定是一个lvalue;

(2)赋值操作由右侧转换到左侧的时候,如果type不一样,那么就需要进行类型的转换,从而可能会导致数据的丢失和错误。

(3)赋值操作符的运算顺序是从右到左的说;

(4)’=‘ 和’==‘的区别

2、复合操作符

+= -= *= /= %=
<<= >>= &= ^= |=

a+=b    等价于a = a + b;   这样貌似会剩打几个字。。。

4.5 Increment and Decrement Operators

1、++i,i++的区别

i++  :  就是编译器会临时开辟一块内存,记录i+1后的值,然后继续用i做运算,最后再把i+1赋值给i;

++i   : 直接就是对i进行+1的操作,再去进行别的运算。

Ps:所以我们应该在非必要的情况下,使用++i用来节约空间或者时间的资源。

2、*iter++ 的运算顺序

等价于*(iter++),然而iter++又是先用的,再加,所以是先*iter,然后再iter+1;

3、一个错误

*beg = toupper(*beg++)

这个不同的编译器会有不同的处理方式,如果是等号右边先进行计算的话,就等价于

*(beg+1) = toupper(*beg);

如果是左边先进行的话

*beg = toupper(*beg);

4.6  The Member Access Operators

e.g

string s1 = '' a strsing",   *p = &s1;
auto n = s1.size();
n= (*p).size;
n= p->size();

dot操作符以及arrow操作符都是用来访问成员的。其中dot操作符是用再一个对象上的,而arrow作符则是用在一个对象的指针上的;

Ps:注意dot操作符的优先级高于  *  操作符的,所以使用(*p).size()的时候一定记得要加上括号的说。

4.7 The conditional Operator

(1)用法

cond ? expr1:expr2;

cond  : 指的就是condition 就是比较条件。

expr1: 如果cond是真的话就执行此句;

expr2:如果cond是假的话就执行此句;

(2)例子

finalGrade = (grade > 90) ? "high pass"
: (grade < 60) ? "fail" : "pass";

这是一个嵌套使用的例子,可以节约代码的行数,使得简介大方,但是不能搞得太多= =,否则成

一团浆糊了 = =。

Attontion:  由于条件操作符的优先级不高,所以再码复合表达式的话一定切记要加上括号。

e.g:  cout << ((grade < 60) ? “fail”:”pass”);

4.8 The Bitwise Operators

**Bitwise Operators 处理的对象最好是unsigned 类型的,因为是直接对位进行操作,所以,如果对于正数,会更容易。

1、用法

  1. bits<<8; // 就是将bits的全部位向左移动8位,而且如果有超出的本部,那些部分直接省略。

    bits>>32; // 就是将bits的全部位向右移动32位,而且如果有超出的本部,那些部分直接省略。

~bits //就是将每一位的数字取反,0变成1,1变成0;

B1 & b2; //就是对每一位进行"与"操作。都是1才是1,否则就为0;

B1 ^ b2 //对每一位进行"亦或"操作,两个数字不一样就为1,一样就为0;

B2 | b2 //对每一位进行"或"操作,两个数字中有一个1就为1,否则就为0;

2、优先级

  1. 在中等级别,必算式运算符低,但又比比较运算符等高一些。

4.9  The sizeof Operator

1、逻辑顺序

是从右往左

2、使用方法

sizeof (type)
sizeof expr

3、sizeof的作用

sizeof char  or an expression of type har  is  guaranteed to be 1;

sizeof作用于一个引用的话,返回的是他引用对象的类型的长度

sizeof作用于一个指针,返回的是指针指向此类型所需要的长度

sizeof·作用于(*P)指针的内容,返回的是,指针的类型的长度(无论指针是不是野指针都可以)

sizeof作用于数组,会返回数组的长度;

sizeof作用于string 和 vector 返回这些类型的长度,而不是返回其中所含元素的个数

C++primer学习笔记(二)——Chapter 4的更多相关文章

  1. C++ Primer学习笔记二

    vector<int> a(10,0); for(vector<int>::iterator itor=a.begin();itor!=a.end();itor++) *ito ...

  2. C++Primer学习笔记(二、基础)

    1.两种初始化方式,直接初始化语法更灵活,且效率更高. ); // 直接初始化 direct-initialization ; // 赋值初始化 copy-initialization 2.const ...

  3. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  4. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  8. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  9. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  10. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

随机推荐

  1. &#x开头的是什么编码呢。浏览器可以解释它。如&#20013;&#22269;等同与中文"中国"?

    形如—— &#dddd; &#xhhhh; &#name; ——的一串字符是 HTML.XML 等 SGML 类语言的转义序列(escape sequence).它们不是「编码 ...

  2. HDU4901 The Romantic Hero 计数DP

    2014多校4的1005 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4901 The Romantic Hero Time Limit: 6000/30 ...

  3. JQUERY 模糊选择

    JQUERY 模糊选择        [属性名称]         匹配包含给定属性的元素      [att=value]       匹配包含给定属性的元素      [att*=value]   ...

  4. 用JSON-server模拟REST API(三) 进阶使用

    用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...

  5. Chrome中的Device模块调式响应性设计

    Chrome中的Device模块调式响应性设计 阅读目录 启用Device模块 Device模块设置介绍 自定义预设介绍 查看media queries 触发触摸事件 回到顶部 启用Device模块 ...

  6. 关闭火车头dedecms发布模块自动关键词,解决火车头发布dedecms文章关键词过多问题

    用火车头发布dedecms文章时,经常会自动添加关键词,这些关键词默认有10个,数量过多,而且是随机提取的,乱七八糟的词都进去了,如下图所示: 这些关键词可能会成为se判断你作弊的依据,现在se也弱化 ...

  7. Excel导入导出,生成和下载Excel报表、附件等操作--ASP.NET

    public class OutExcel { public static void OutExcel_bb(DataTable dt, string thepath, string temppath ...

  8. Android EditText 文本框实现搜索和清空效果

    前言 本文实现的效果:文本框输入为空时显示输入的图标:不为空时显示清空的图标,此时点击清空图标能清空文本框内输入文字. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnbl ...

  9. function foo(){}、(function(){})、(function(){}())等函数区别分析

    前面一段时间,看到(function(){}),(function(){}())这些函数就犯晕,不知道它到底是什么意思,为什么函数外要加小括号,函数后要加小括号,加和不加到底有什么区别……一直犯迷糊, ...

  10. Dynamic Morphing Square(动态变形矩阵)

    题目描述: 解题思路: 先对输入的N进行判断,是否不小于3,如果小于3,需要继续输入一个新的数,知道输入的N比3大. 第一个打印的矩阵,*号为最外面一圈,其余全为-. 第二个打印的矩阵,*号向内缩减了 ...