博客主页 😥
分类

学习笔记

下的文章

Blog:

KDMY
27
无标签
C++ string and vector
C++ string and vectorstring标准库类型 string 表示可变长的字符序列,使用 string 类型必须首先包含 string 头文件。#include<string>using std::<string>定义和初始化string对象下列列出了string对象最常用的一些方式:string s1; //默认初始化,s1是一个空串 string s2 = s1; //s2是s1的副本 string s3 ="hiya"; //s3是该字符串字面值的副本 string s4(10,'c') //s4的内容是 cccccccccc可以通过默认的方式初始化一个 string 对象,这样就会得到一个空的 string 对象,也就是说该 string 对象中没有任何字符。如果提供了一个字符串字面值,则该字面值除了最后那个空字符以外其他的所有字符都被拷贝到新创建的 string 对象中去。string s1 //默认初始化,s1是一个空串 string s2(s1) //s2是s1的副本 string s2 = s1 //等价于s2(s1),s2是s1的副本 string ("value") //s3是字面值"value"的副本,除了字面值最后的那个空字符外 string "value" //等价于s3("value"),s3是字面值"value"的副本 string s4(n,'c') //把s4初始化为连续n个字符c组成的串直接初始化和拷贝初始化如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化string s5 = "hiya"; //拷贝初始化 string s6("hiya"); //直接初始化 string s7(10,'c'); //直接初始化,s7的内容ccccccccccc对于用多个值进行初始化的情况,非要用拷贝初始化的方式来处理,需要先创建一个显式地创建一个(临时)对象用于拷贝:string s8 = string(10,'c'); //拷贝初始化,s8的内容是cccccccccc实际上是用数字10和字符c两个参数创建出来的一个string对象,然后这个string对象又拷贝给了s8。这条语句本质上等价于下面的两条语句:string temp(10, 'c'); //temp的内容是cccccccccc //temp 临时变量 string s8 = temp; //将temp拷贝给s8string对象上的操作os << s 将s写到输出流os当中,返回os is >> s 从is中读取字符串赋给s,字符串以空白分隔,返回is getline(is,s) 从is中读取一行赋给s,返回is s.empty() s为空返回true,否则返回false s.size() 返回s中字符的个数 s[n] 返回s中第n个字符的引用,位置n从0计起 s1 + s2 返回s1 和 s2连接后的结果 s1 = s2 用s2的副本代替是s1中原来的字符 s1 == s2 如果s1和s2中所含的字符完全一样,则它们相等;string对象的相等性判断对字面的大小写敏感 s1 != s2 <, <=, >, >= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感读写string对象int main(){ string s; //空字符串 cin >> s; //将string对象读入s,**遇到空白则停止** cout << s << endl; //输出s return 0; }在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一个空白为止。例如:int main(){ string s; cin >> s; //输入 hello word cout << s << endl; }输出结果如下:如上所述,如果程序输入的是:" hello word "(注意开头和结尾的空格),则输出将是"hello",输出结果中没有任何空格。string s1, s2; cin >> s1 >> s2; //把第一个输入读到s1中,第二个输入读到s2中 cout << s1 << s2 << endl; //输出两个string对象假设给上面这段程序输入与之前一样的内容" hello word! ",输出的将是"helloword!"使用geline读取一整行(待更新)vector容器定义和初始化vector对象vector<T> v1 v1是一个空vector,它潜在的元素是T类型的,执行默认初始化 vector<T> v2(v1) v2中包含有v1所有元素的副本 vector<T> v2 = v1 等价于v2(v1),v2包含有v1所有元素的副本 vector<T> v3(n, val) v3包含了n个重复的元素,每个元素的值都是val vector<T> v4(n) v4包含了n个重复的执行了值初始化的对象 vector<T> v5{a,b,c...} v5包含了初始值个数的元素,每个元素被赋予相应的初始值 vector<T> v5 = {a,b,c...} 等价于v5{a,b,c...}
72
用三层交换机互连三个地区的网络
用三层交换机互连三个地区的网络思路配置一台三层交换机,三台交换机,一个路由器(按需求)、按照需求的电脑将三个区域划分出来。用直通线和交叉线将它们连接将各个地区的IP地址、网关以及广播地址分配确定。创建三个vlan,将三个区域的电脑分别进入不同的vlan。以下是一个区域二层交换机的配置:en //进入特权模式 conf t //进入全局配置模式 vlan 10 //创建vlan 10 vlan 20 //创建vlan 20 vlan 30 //创建vlan 30 int range f0/1 3 //操作多个端口 sw m access //将端口设置为access模式 sw access vlan 10 //将端口加入到vlan 10在上面的基础上,将其它区域的二层交换机一个个配置。配置三层交换机(S)en //进入特权模式 conf t //进入全局配置模式 int r g 1/0/1 3 //操作多个端口 switchport t en dotlq //入接口协议封装 dotlq switchport mode trunk //端口设置为 trunk模式 vlan 10 //创建vlan 10 vlan 20 //创建vlan 20 vlan 30 //创建vlan 30 int vlan 10 //配置vlan 10 ip add 192.168.10.1 255.255.255.128 //添加区域1的网关 int vlan 20 //配置vlan 20 ip add 192.168.10.129 255.255.255.128 //添加区域2的网关 int vlan 30 //配置vlan 30 ip add 192.168.30.1 255.255.255.0 //添加区域3的网关 exit //返回上一级 ip routing //打开路由模式(重要)将各个互连设备的IP和网关设置好设置好后用ping来进行检查是否能互相通信区域1与通信它的网关:区域1与区域2通信:区域1与区域3通信:区域2通信它的网关:区域2通信区域1:可以看到在通信时掉了一个包,那是正常的,它在学习路线。区域2通信区域3:区域3通信它的网关:区域3通信区域1:区域3通信区域2:
46
无标签
因特网概述
因特网概述网络、互连网和因特网网络(Network)由若干个结点(Node)和连接这些结点的链路(Link)组成。多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即为互联网(互联网)。因此,互连网是“网络的网络(Network of Networks)”。因特网(Internet)是世界上最大的互连网络(用户数以亿计,互连的网络数以百万计)。internet与Internet的区别internet(互联网或互连网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。这些网络之间的通信协议是可以任意的。Internet(因特网)则是一个专用名词,它指当前全球最大的、开放的、由多网络相互连接而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET。ISP(Internet Service Provider)什么是ISP?ISP译为因特网服务提供者,ISP可以从管理机构申请到很多的IP地址,机构和个人可以通过某个ISP获取到IP地址的使用权,这一点很重要,因为因特网上的主机都必须有IP地址才能进行网络通信,这样就能通过ISP接入到因特网。基于ISP的三层结构的因特网第一层ISP被称为因特网主干网(主干ISP),第二层被称为地区网(地区IPS),第三次IPS被称为本地网(本地ISP)主干网:一般能覆盖国际范围拥有高速链路和交换设备。(第一层ISP之间直接互联)地区网:通常具有区域性或国家性覆盖规模,第二层ISP和一些大公司都是第一层ISP的用户,(与少数第一层ISP相连接)本地网:只拥有本地范围的网络,一般校园网企业网,第二层ISP的用户。一个但某个用户能接入到因特网,那么它也可以成为一个ISP,但需要调制器或路由器这样的设备,让其它用户能够与它相连。因特网的组成边缘部分由所有连接在因特网上的主机(端系统)组成。这部分用户是直接使用的,用来通信(传送数据、音频或视频)和资源共享。核心部分由大量网络和连接这些网络的路由器组成。这部分是为边缘部分提供服务的(提供连通性和交换)三种交换模式电路交换(Circuit Switching)如果有n部电话机需要两两相连,就需要n(n 1)/2条电线,这样做太过于麻烦,于是就使用一个间设备将这些电话连接起来,这个中间设备就是电话交换机,每一个电话都连接在电话交换机上,将需要通信的任意两部电话的电话线路按需接通。电话交换机接听电话线的方式称为电路交换。从通信资源分配来看,交换(Switching)就是按照某种方式动态地分配传输线路的资源。电路交换的三个步骤:1.建立连接(分配通信资源)2.通话(一直占用通信资源)3.释放连接(归还通信资源)当使用电路交换来传输计算机数据时,其路线的传输效率往往很低。分组交换(Packet Switching)英特网中最重要的分组交换机就是路由器,它将各个网络互联起来并对接收到的分组进行转发(分组交换)。把要发送的数据(整块数据,比如一个word文档)称为一个报文,发送报文之前,发送源主机将报文划分为多个更小的等长数据段,在每个数据段前面加一写必要的控制信息(比如目的地址)组成首部,就构成一个分组,也可称为包,首部就叫包头。分组交换机(路由器)就根据首部的目的地址来查表转发,发到目的地主机,然后目的地主机将各数据段去掉首部,组合,还原出原始报文。各分组传输过程有不同路径即不同路由;分组乱序,即分组达到目的地的顺序不一定和分组在源站的发送顺序相同;才外还有传输过程的分组丢失、误码、重复发送方:构造分组 发送分组路由器:缓存分组 转发分组 —简称为存储转发接收方:接收分组 还原分组报文交换报文交换中的交换节点也采用存储转发方式,但报文交换对报文没有大小限制,这就要求交换节点有较大的缓存空间(也就是不分组了,直接将报文存储转发)。报文交换主要用于早期的电报通信网,现在较少使用,通常被更先进的分组交换方式取代。三种交换方式的缺点优点电路交换优点:通信时延小有序传输没有冲突适用范围广实时性强控制简单缺点:建立连接时间长线路独占,使用效率低灵活性差难以规格化报文交换优点:无需建立连接动态分配路线提高线路可靠性提高线路利用率提供多目标服务缺点:引起了转发时延需要较大存储缓存空间需要传输额外的信息量分组交换优点:无需建立连接线路利用率高简化了存储管理加速传输减少出错概率和重发数据量缺点:引起了转发时延需要传输额外的信息量对于数据报服务,存在失序、丢失或重复分组的问题;对于虚电路服务,存在呼叫建立、数据传输和虚电路释放三个过程计算机网络的定义和分类计算机网络的定义计算机网络的精确定义并未统一计算机网络的最简单的定义是:一些互相连接的、自治的计算机的集合。互连:是指计算机之间可以通过有线或无线的方式进行数据通信自治:是指独立的计算机,它有自己的硬件和软件,可以单独运行和使用;集合:是指至少需要两台计算机计算机网络的较好的定义是:计算机主要是由一些通用的、可编程的硬件互联而成,而这些硬件并非专门用来实现某一特定的目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用计算机网络所连接的硬件,并不限于一般的计算机,而是包括了智能手机等智能硬件。计算机网络并非专门用来传输数据,而是能够支持很多种应用(包括今后可能出现的应用)。计算机网络的分类按交换技术分类电路交换网络报文交换网络分组交换网络按使用者分类公用网致电信公司出资建造的大型网络,“公用”的意思就是指愿意按电信公司的规定缴纳费用的人都可以使用这种网络,因此公用网也可称为公众网。专用网是指某个部门为本单位的特殊业务工作的需要建立而建立的网络。网路不向本单位以外的人提供服务(例如,军队、铁路、电力等系统)。按传输介质分类有线网络有线网是采用同轴电缆、双绞线、光钎等有型的实体物理介质来传输数据的网络。无线网络无线网是采用微波、卫星等无线形式来传播数据的网络。按覆盖范围分类广域网 (Wide Area Network, WAN, 也称为远程网)覆盖范围:几十公里 —— 几千公里,可以覆盖一个国家、地区、甚至横跨几个州;广域网是因特网的核心部分,其任务是为核心路由器提供远距离(例如,跨越不同的国家)高速连接,互连在不同区域的城域网(MAN)和局域网(LAN)。城域网 (Metropolitan Area NetWork, MAN)MAN覆盖范围:10km~100km用于将一个城市、一个地区的企业、机关或学校的局域网连接起来,实现区域内的资源共享局域网 (Local Area NetWork, LAN)覆盖范围:常见的办公室、宿舍或网吧中的网络就是局域网。几米到10km以内。特点:连接范围窄,用户少,配置容易,连接速率高。个域网 (Personal Area Network, PAN, 也称无线个人区域网WPAN)它不同于上述网络,不是用来连接普通计算机的,而是在个人工作的地方把属于个人使用的电子设备(例如,便携式计算机、打印机、鼠标、键盘等),用无线技术连接起来的网络。按拓扑结构分类总线型结构总线型结构是指各结点均挂在一条总线上,地位平等,无中心结点控制,其传递方向总是从发送消息的结点开始向两端扩散,如同广播电台发散信息一眼,因此又称广播式计算机网络优点:建网容易、增减结点方便、节省线路;缺点:重负载时通信效率不高,总线任意一处出现故障,则全网瘫痪。星型结构星型结构是指各工作站以星型方式连接成网,实际上可以看做是在总线结构的网络,其公用总线缩成一个点形成的网络结构。星型网络有中央结点,其他工作站。服务器等结点都与中央结点直接相连,这种结构以中央结点为中心,因此称为集中式网络。优点:结构简单、便于管理;控制简单、便于建网;网络延时小,传输误差底。缺点:成本高、可靠性较低、资源共享能力也较差,但由于作为中心结点的设备近年来可靠性大幅提高、价格下降,因此星型结构网络目前在小型网络中占据较大的比例。环形网络环型结构由网络中若干结点通过点到点的链路首尾连形成一个闭合的环。这种结构使用公共传输电缆组成环型连接,数据在环路中沿着一个方向在各个结点间传输,信息从一个结点到另一个结点。优点:网状型网络在网状结构中,网络的每台电脑设备之间均有点到点的链路连接,这种连接不经济,只有每个站点都要频繁地互相发送信息时才使用这种方法。它的安装配置也很复杂,但系统可靠性高,容错能力强。有时网状结构也称为分布式结构优点:可靠性高缺点:控制复杂、线路成本高计算机网络的性能指标性能指标可以从不同的方面来度量计算机网络的性能。常用的计算机网络的性能指标有以下8个:速率速率:连接在计算机网络上的主机在数字信道上传送比特的速率,也称为比特率或数据率。bit/s (b/s, bps) , kb/s = 10^3^ b/s (bps) , Mb/s = k $\times$ Kb/s = 10^3^ $\times$ 10^3^ b/s = 10^6^ b/s (bps) , Gb = k $\times$ Mb/s = 10^3^ $\times$ 10^6^ b/s = 10^9^ b/s (bps) , Tb/s = k $\times$ Gb/s = 10^3^ $\times$ 10^9^ b/s = 10^12^ b/s (bps)常用数据单位:bit/s(b/s, bps) , kb/s = b/s比特:8 bit = 1 Byte , KB = 2^10^ B , MB = K $\times$ KB = 2^10^ $\times$ 2^10^ B = 2^20^ B , GB = K $\times$ MB = 2^10^ $\times$ 2^20^ B = B , TB = K $\times$ GB = 2^10^ $\times$ 2^30^ B = B带宽带宽在模拟信号中的意义:单位:Hz (kHz,MHz,GHz)信号所包含的各种不同频率成分所占领据的频率范围;带宽在计算机网络中的意义:单位:b/s (kb/s, Mb/s, Gb/s, Tb/s)用来表示网络的通信线路所能传送的数据的能力,因此网络带宽表示在单位时间内从网路某一点到达另外一点所能通过的“最高数据率”;吞吐量表示在单位时间内通过某个网络(或信道、接口)的数据量。吞吐量被经常用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。吞吐量受网络的带宽或额定速率的限制。时延网络时延:发送时延 $$\frac{分组长度(b)}{发送速率(b/s)}$$传播时延 $$\frac{信道长度(m)}{电磁波传播速率(m/s)}$$电磁波传播速率:自由空间:3 $\times$ 10^8^ m/s;铜线:2.3 $\times$ 10^8^ m/s;光纤:2.0 $\times$ 10^8 m/s。处理时延:一般不方便计算时延带宽积时延带宽积 = 传播时延 $\times$ 带宽若发送端连续发送数据,则在第一个比特即将到达终点时,发送端就已经发送了时延带宽积个比特;链路的时延带宽积又称为以比特为单位的链路长度。往反时间RTT(Round Trip Time)往返时间在计算机网络中它是一个重要的性能指标。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经历的时间。利用率$$ 利用率\left \{ \begin{array}{c} 信道利用率 \\ 网络利用率 \end{array} \right. $$信道利用率:用来表示某信道有百分之几的时间是被利用的(有数据通过)。网络利用率:全网络信道利用率的加权平均。根据排队论,当某信道的利用率增大时,该信道引起的时延也会迅速增加;因此,信道利用率并非越高越好;如果令D0表示网络空闲时的时延,D表示网络当前的时延,那么在适当的假定条件下,可以用下面的简单公式来表示D、D0和利用率U之间的关系:$$D=\frac{D~0~}{1 U}$$当网络的利用率达到50%时,时延就要加倍;当网络的利用率超过50%时,时延急剧增大;当网络的利用率接近100%时,时延就趋于无穷大;因此,一些较大主干网的ISP通常会控制它们的信道利用率不超过50%。如果超过了,就要准备扩容,增大线路的宽带。也不能使信道利用率太低,这会使宝贵的通信资源白白浪费。应该使用一些机制,可以根据情况动态调整输入到网络中的通信量,使网络利用率保存在一个合理的范围内。丢包率丢包率即分组丢失率,是指在一定范围内,传输过程中丢失的分组数量与总分组数量的比例;分组丢失的两个主要原因:分组误码,结点交换机缓存队列满(网络拥塞)计算机网络体系结构(重点)计算机网络体系结构OSI体系结构(法律上的国际标准)物理层数据链路层网络层运输层会话层表示层应用层TCP/IP体系协议(事实上的国际标准)网络接口层 网络接口1 网络接口2 为了将不同的网络接口进行互连,因此它的网络接口层并没有规定什么具体的内容。网际层 IP IP协议可以将不同的网络接口进行互连,并向TCP协议和UDP协议提供网络互联服务。IP协议作为TCP/IP体系界中的核心协议,负责互连不同的网络接口(IP over everything;),为各种网络应用提供服务(everything over IP).运输层 TCP TCP协议在享受IP协议提供的网络互连服务的基础上,可向应用层的相应协议提供可靠传输的服务 UDP UDP协议在享受IP协议提供的网络互连服务的基础上,可向应用层的相应的协议提供不可靠传输的服务。应用层 HTTP SMTP DNS RTP原理体系结构(适于教学)物理层数据链路层网络层运输层应用层计算机网络体系结构分层的必要性物理层:解决使用何种信号来传输比特的问题数据链路层:解决分组在一个网络(或一段链路)上的传输问题网络层:解决分组在多个网络上传输(路由)的问题运输层:解决进程之间基于网络的通信问题解决通过应用进程的交互来实现特定网络应用的问题
40
无标签
指针
指针指针(pointer)“指向(point to)“另外一种类型的复合类型。与引用类似,指针也实现了对其它对象的间接访问。指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。指针无需在定义时赋初值。在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。int *p1, p2; //p1和p2都是指向int型对象的指针double dp, *dp2 //dp2都是指向double型对象的指针,dp是double型获取对象的地址指针存放着某个对象的地址,想要获取该地址,需要使用取址符(操作符&):int ival = 42; int *p = &ival; //p存放变量ival的地址,或者说p是指向ival的指针因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。指针值指针的值(即地址)应属于下列4种状态之一:指向一个对象指向紧邻对象所占空间的下一个位置。空指针,意味着指针没有指向任何对象。无效指针,也就是上述情况之外其他值。试图拷贝或以其他方式访问无效指针的值都将引发错误。利用指针访问对象如果一个指针指向了一个对象,则允许使用解引用符(操作符 *)来访问该对象:int ival = 42; int *p = &ival; //p存放着变量ival的地址,或者说p是指向ival的指针 cout << *p << endl; //由符号*得到指针p所指的对象,输出42对指针解引用会得出所指的对象,因此如果给解引用的结果赋值,实际上也就是给制作所指的对象赋值:*p = 0; //由符号*得到指针p所指的对象,即可经由p为变量ival的赋值 cout << *p << endl; //输出0为 *p 赋值实际上是为了 p 所指的对象赋值。空指针空指针(null pointer)不指向任何对象,在试图使用一个指针代码可以首先检查它是否为空。以下列出几个生成空指针的方法:int *p = nullptr; //等价于int *p = 0; int *p = 0; //直接将p2初始化为字面常量0 //首先需要 #include cstdlib int *p3 =NULL; //等价于int *p = 0;现在的C++程序最好使用nullptr,同时尽量避免使用NULL。赋值和指针引用本身并非一个对象。一旦定义了引用,就无法令其再绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象。指针和它存放的地址之间就没有这种限制了。和其他任何变量(只要不是引用)一样,给指针赋值就是令它存放一个新的地址,从而指向一个新的对象:int i = 42; int *pi = 0; //pi被初始化,没有指向任何对象 int *pi2 = &i; //pi2被初始化,存有i的地址 int *pi3; //如果pi3定义于块内,则pi3的值是无法确定的 pi3 = pi2; //pi3和pi2指向同一个对象i pi2 = 0; //现在pi2不指向任何对象了其他指针操作只要指针有一个合法值,就能将它用在条件表达式中。和采用算术值作为条件遵循的规则类似,如果指针的值是0,条件则取false:int ival = 1024; int *pi = 0; //pi合法,是一个空指针 int *pi2 = &ival; //pi2是一个合法的指针,存放着ival的地址 if(pi) //pi的值是0,因此条件存放的值是false //.... if(pi2) //pi2指向ival,因此它的值不是0,条件的值是true //....任何非0指针,对应的条件值都是true。void* 指针void*是一种特殊的指针类型,可以用于存放任意对象的地址。double obj = 3.14, *pd = &obj; //正确:void*能存放任意类型对象的地址 void *pv = &obj; //obj可以是任意类型的对象 pv = pd; //pv可以存放任意类型的指针利用void 指针能做的事比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋值给另一个void 指针。不能直接操作void*指针所指的对象,因为我们并知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。指向指针的指针通过 的个数可以区分指针的级别。也就是说,表示指向指针的指针,表示指向指针的指针的指针,以此类推:int ival = 1024; int *pi = &ival; //pi指向一个int型的数 int **ppi = &pi; //ppi指向一个int型的指针此处pi是指向int型数的指针,而ppi是指向int型指针的指针,下图描述了它们之间的关系。解引用int型指针会得到一个int型的数,同样,解引用指向指针的指针会得到一个指针。此时为了访问最原始的那个对象,需要对指针的指针做两次解引用:cout << "输出方式:\n" << "int类型输出:" << ival << "\n" << "指向ival的指针:" << *pi << "\n" << "指向指针的指针:" << **ppi << endl;该程序使用三种不同的方式输出了变量ival的值:第一种直接输出;第二种通过int型指针pi输出;第三种两次解引用ppi,取得ival的值。指向指针的引用引用本不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:int i = 42; int *p; //p是一个int型指针 int &r = *p; //r是一个对指针p的引用 r = &i; //r引用了一个指针,因此给r赋值&i就是令p指向1 *r = 0; //解引用r得到i,也就是p指向的对象,将i的值改为0
37
无标签
左值和右值
前言在学习C++的过程中,我一直对左值(lvalue)和右值(rvalue)的概念模糊不清,所以有了这篇文章。左值和右值的定义在C++中,左值它是指向一个内存地址的,右值是则没有指向任何内存地址。这就造成了右值是短暂和短命的。而左值则能活很久,因为它是以变量(variable)的形式存在的。可以把左值看作一个容器(container),而右值是容器里面的事物。容器消失了,里面的事物就会消失。int a = 60; //a是左值,60则是右值在这里,60是一个右值,一个数字(字面常量(literal constant))它没有指定的内存地址,在程序运行时它储存在临时的寄存器外,在该例中,60被赋予(assign)给a,a是一个变量,一个变量(specific)有着具体的内存位置,所以它是一个左值。C++中声明赋值(assignment)需要一个左值作为它的左操作数(left operand);这完全合法的。对于左值a,你可以做这样的操作:int* b = &a; //ok在这里我通过地址操作符&获取了a的内存地址并且把它放进b,&操作符需要一个左值且产生一个右值,这也是完全合法的操作,在赋值操作符左边我们有一个左值,在右边我们使用取址操作符产生右值。然而,我们不能这样写:int y; 60 = y; //error上面的错误显而易见,但从技术上来说60是一个字面常量也就是一个右值,它没有一个具体的内存地址(memory location),所以它会把y分配到一个不存在的地方。导致程序错误。下面是GCC给出的变异错误提示:error: lvalue required as left operand of assignment赋值的左操作符需要一个左值,这里我们使用了一个右值60我们也不能这样做:int* a = &60; //errorGCC给出了以下错误提示:error: lvalue required as unary '&' operand\`&操作符需要一个左值,因为右值它没有具体的内存地址,在进行取址操作时,会发生取不到地址的错误。返回左值和右值的函数待更新Sources参考博客 internalpoiners ==点击==
本站已运行 127 天 21 小时 13 分 自豪地使用 Typecho 建站,并搭配 MyDiary 主题 Copyright © 2022 ~ 2022. KDMY All rights reserved.
历史足迹
分类目录
  • 默认分类
  • 学习笔记