C++primer学习笔记(二)——Chapter 4
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、用法
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、优先级
在中等级别,必算式运算符低,但又比比较运算符等高一些。
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的更多相关文章
- C++ Primer学习笔记二
vector<int> a(10,0); for(vector<int>::iterator itor=a.begin();itor!=a.end();itor++) *ito ...
- C++Primer学习笔记(二、基础)
1.两种初始化方式,直接初始化语法更灵活,且效率更高. ); // 直接初始化 direct-initialization ; // 赋值初始化 copy-initialization 2.const ...
- C++ Primer学习笔记(二)
题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接 C++ Primer学习笔记(一) 27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
随机推荐
- 【转】不得不看的两次从C++回归C的高手评论C++
不得不看的两次从C++回归C的高手评论C++ Linux之父炮轰C++:糟糕程序员的垃圾语言 Linux之父话糙理不糙 不得不看的两次从C++回归C的高手评论C++ C语言是否该扔进垃圾桶 为什么每个 ...
- 点击label时click事件被触发两次的坑
今天帮群里的朋友看一段代码的时候偶然间遇到一个label的坑,点击label的时候,监听的click事件被执行两次: 具体代码如下: <div id="test"> & ...
- 初识suse-Linux相关!
Linux这种系统很奇怪,差不多每种不同的版本,它所使用的安装等一些重要命令皆有所变化.假若,你要熟练掌握一种OS,那么如果安装软件/应用,那是入门的第一步. 安装命令中: RedHat.CentOS ...
- [Effective JavaScript 笔记]第39条:不要重用父类的属性名
假设想给上节讲的场景图库添加收集诊断信息的功能.这对于调试和性能分析很有用. 38条示例续 给每个Actor实例一个唯一的标识数. 添加标识数 function Actor(scene,x,y){ t ...
- why we use Symbols in Hash
Rather than using Strings as the keys in a Hash, it’s better practice to use Symbols. Symbols are ju ...
- 彻底理解数字图像处理中的卷积-以Sobel算子为例
彻底理解数字图像处理中的卷积-以Sobel算子为例 作者:FreeBlues 修订记录 2016.08.04 初稿完成 概述 卷积在信号处理领域有极其广泛的应用, 也有严格的物理和数学定义. 本文只讨 ...
- 原创:分享asp.net伪静态成目录形式iis如何设置
服务器租用详解asp.net伪静态成目录形式iis如何设置: 一.首先介绍一下asp.net伪静态成html后缀iis如何设置的 iis6 伪静态 iis配置方法 图解 1.右键点击 要设置网站的网站 ...
- jQuery backgroundColor的animate效果
我们知道jQuery几乎是我们最常用的javascript库了,不过尽管他自己本身拥有大量的特效,但却仍然缺少一些动画效果.比如说,颜色.背景颜色的变换. animate一般只支持大小,位置,透明度的 ...
- python动态获取对象的属性和方法
http://blog.csdn.net/kenkywu/article/details/6822220首先通过一个例子来看一下本文中可能用到的对象和相关概念.01 #coding: UTF- ...
- MySQL的LIMIT与分页优化
在系统中需要进行分页操作的时候,我们通常会使用LIMIT加上偏移量的办法实现,同时加上合适的ORDER BY子句.如果有对应的索引,通常效率会不错,否则,MySQL需要做大量的文件排序操作. 一个非常 ...