赋值

【知识总结】C/C++左值&&右值

岁酱吖の 提交于 2020-02-13 09:25:38
左值(lvalue)和右值(rvalue)最先来源于编译。在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。 C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。或者说 左值是代表一个内存地址值 ,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作,这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值,既 指的是引用了一个存储在某个内存地址里的数据 。 简单来说就是,左值相当于地址值,右值相当于数据值。 例如: int ia,ib; ib=0; ia=ib; 在这里,首先定义ia,ib。然后对ib赋值,此时计算机取ib的左值,也就是这个符号代表的内存位置即内存地址值,计算机取0的右值,也就是数值0;然后给ia赋值为ib,此时取ib的右值给ia的左值; 所以说,ib的左值、右值是根据他的位置来说的;这也算是形式语言的一个有意思之处吧。 来源: https://www.cnblogs.com/lu-yang/archive/2011/11/24/2261990.html

i++和++i

隐身守侯 提交于 2020-02-13 09:24:59
区别1: i++ 返回原来的值,++i 返回加1后的值   这个很明显,不给予解释。 区别2: i++ 不能作为左值,而++i 可以 1 int i = 0; 2 ++i = 1; //正确 3 i++ = 5; //错误 左值:   左值放在赋值符号(=)的左边,左值表示 存储在计算机内存的对象 ,而不是常量或计算的结果。左值在内存中可以进行读和 写 操作,左值 可以被赋值 右值:   右值放在赋值符号(=)的右边,右值代表的真实值,相当于 数据值 ,不可以被赋值 简单来说,左值与右值的 根本区别 在于 是否允许 取地址运算符&获得对应的内存地址。 // ++i int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用 { *this += 1; // 增加 return *this; // 取回值 } //i++ const int int::operator++(int) //函数返回值是一个非左值型的,额外的int形参在函数中可以使用但是一般不这么做,只是用来区分后置版本和前置版本 { int oldValue = *this; // 开辟额外的空间,存下原值 ++(*this); // 调用++i增加 return oldValue; // 返回被取回的值 } i++ 最后返回的是一个 临时变量 oldValue

C++中的左值和右值

瘦欲@ 提交于 2020-02-13 09:24:03
C++语言中可以放在等号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。 [1]   或者说左值是代表一个内存地址值,通过这个内存地址,就可以对内存进行读写操作; [2] 这也就是为什么左值可以被赋值的原因了。   相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。   比如: int ia,ib;   ib=0;   ia=ib;   在这里,首先定义ia,ib。然后对ib赋值,此时计算机取ib的左值,也就是这个符号代表的内存位置即内存地址值,计算机取0的右值,也就是数值0;然后给ia赋值为ib,此时取ib的右值给ia的左值;   所以说,ib的左值、右值是根据他的位置来说的; 来源: https://www.cnblogs.com/xiaodi914/p/5657585.html

给成员变量赋值的两种方法

我与影子孤独终老i 提交于 2020-02-12 21:12:09
JAVA 跟C++ 差不多,给类里面的私有成员变量一般有两种方法: 一种是通过 成员函数 来赋值 一种是:通道构造函数来赋值 /* 我们一直在使用构造方法,但是,我们确没有定义构造方法,用的是哪里来的呢? 构造方法的注意事项: A:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。 B:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法 给成员变量赋值有两种方式: A:setXxx() B:构造方法 */ class Student { private String name; private int age; public Student() { //System.out.println("我给了,你还给不"); System.out.println("这是无参构造方法"); } //构造方法的重载格式 public Student(String name) { System.out.println("这是带一个String类型的构造方法"); this.name = name; } public Student(int age) { System.out.println("这是带一个int类型的构造方法"); this.age = age; } public

数据结构

落爺英雄遲暮 提交于 2020-02-12 13:43:00
include<stdio.h> include<stdlib.h> define max 30 typedef struct{ int *data; int front,rear; }circqueue; //给队列赋值 int firstadd(circqueue q){ q->data=(int )malloc(max*sizeof(int)); int x; printf("请输入赋值数:"); scanf("%d",&x); while(x!=0&&q->rear!=max-1){ q->data[q->rear++]=x; printf("请输入赋值数:"); scanf("%d",&x); } return 0; } //返回队列的元素个数 int returnmath(circqueue *q){ return (q->rear-q->front+max)%max; } //将元素插入x插入队尾 int enqueue(circqueue *q,int x){ if((q->rear+1)%max==q->front){ return 0; } q->data[q->rear]=x; q->rear=(q->rear+1)%max; return 1; } //删除队头元素并将其返回 int dequeue(circqueue *q){ if(q->front==q

javascript预编译

点点圈 提交于 2020-02-12 08:14:49
js作为一本脚本语言,可以不经过编译直接运行,但遇到预编译的问题,尤其是变量或函数同名时,这点知识就尤其必要了。 理解预编译首先要弄清楚两种概念:函数声明和变量赋值。 function fun(){ }//函数声明 这种形式的写法是函数声明,即声明一个函数,脚本在执行之前会做预编译处理。 var fun= function(){ }//变量赋值 这种写法是变量赋值,函数在js语言里也是一种数据,匿名函数作为变量赋值给定义的变量。这种形式在预编译处理阶段,只会给变量ledi分配一个内存空间,不会做初始化。初始化过程中会在执行时执行。 <script><script/>也可看做一个函数,那么它执行前同样进行预编译,与执行函数前预编译四部曲步骤差不多,但它没有形参和实参,就少了一些步骤,但也有不同之处,就是它此时创建不是AO对象了,具体如下: 1.创建GO对象(global object)即window; 2.查找全局变量,将变量名作为window的属性,赋值为undefined(注:未声明就赋值的变量,即隐式变量,也是全局变量); 3.在<script><script/>内查找函数声明,函数名作为全局对象的属性,值为函数引用; 当变量名与函数名相同时,AO或GO内只建一个属性名; 预编译: 函数的预编译发生在执行函数之前。 预编译四部曲: 1.创建AO对象; 2.找形参和变量声明

(02)Python_变量

匆匆过客 提交于 2020-02-12 02:19:09
编写代码时要避免代码重复,提高代码的复用性,称之为DRY(don't repeat yourself)。否则会导致维护困难,修改时容易造成遗漏。为了避免重复,学习其中一种方式—— 变量 。 name = '三毛' 这是一个常见的定义变量操作,意思是把 '三毛' 赋值 给 name 这个变量。 变量 就像一个盒子,是存放数据的容器,东西放进去的过程被称为 赋值 ,盒子上的标签就是 变量名 。通过标签名能知道盒子里的东西是什么,通过变量名便也能得到变量存储的内容。 与其他编程语言不同的是,Python并没有声明变量的命令,首次为其赋值时,才会创建变量。例如: name = '三毛' print('三毛') print(name) 两种方式打印结果是一样的: 三毛 三毛 注意 :Python中 = 表示赋值,而不是判断相等。Python 中判断左右两边是否相等的是比较运算符 == 。 变量不需要使用任何特定类型声明,甚至可以在设置后更改其类型。如: x = 5 # x is of type int y = 3.14 #y is of type float z = "Sanmao" # z is now of type str print(x) print(y) print(z) 运行结果: 5 3.14 Sanmao 变量的两大优势: 避免重复; 修改方便,写错了只需要修改一个地方

右值

老子叫甜甜 提交于 2020-02-12 01:51:31
先来几个快速问答: 右值什么时候出现的?右值早就有了,右值引用直到c++11才有的 右值引用有什么用?为了减少拷贝。 为什么右值引用能减少拷贝?右值赋值给右值引用变量的时候,直接将右值对应的地址交给右值引用变量,相当于对应的内存换了个马甲。 什么时候用右值引用?一般都是将左值转换成右值,然后赋值给右值引用,来减少拷贝。 为了区分左右值,看几个例子,来自CSDN: int a = 10; int b = 20; int *pFlag = &a; vector<int> vctTemp; vctTemp.push_back(1); string str1 = "hello "; string str2 = "world"; const int &m = 1; 请问,a,b, a+b, a++, ++a, pFlag, *pFlag, vctTemp[0], 100, string("hello"), str1, str1+str2, m分别是左值还是右值? a和b都是持久对象(可以对其取地址),是左值; a+b是临时对象(不可以对其取地址),是右值; a++是先取出持久对象a的一份拷贝,再使持久对象a的值加1,最后返回那份拷贝,而那份拷贝是临时对象(不可以对其取地址),故其是右值; ++a则是使持久对象a的值加1,并返回那个持久对象a本身(可以对其取地址),故其是左值; pFlag和

赋值运算符重载以及细节上的问题(operator=)

空扰寡人 提交于 2020-02-11 22:47:19
我们在学习类的时候知道一个完整的类中应该存在大默认函数函数: 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符的重载函数 5.取地址操作符的重载函数 6.const修饰的取地址操作符的重载函数 构造函数,析构函数,拷贝构造函数大家应该不怎么陌生,今天给大家讲解一下我理解的赋值运算符重载函数并且讲一下里面需要注意的易错点(这些易错点都是血与泪的教训) 首先赋值运算符的重载顾名思义就是:“重新定义一下‘=’这个符号”,可能大家要问什么时候需要重载运算符?为什么要重载呢? 用途: 首先我们说运算符的重载是针对类生成的对象而言的,当我们有了对象A新对象B,我们想把对象B赋给对象A时(意思就是让对象A和B完全一样)这时候就需要用到赋值运算符的重载,在我们类中就有默认的赋值运算符重载函数,但是它适用的场景很少,所以大多数情况我们都需要自己实现赋值运算符的重载。 #include<iostream> #include<string.h> class CMystring { public: CMystring(char*pdata=NULL);//构造函数 CMystring(const CMystring&str);//拷贝构造函数 ~CMystring();//析构函数 CMystring&operator =(const CMystring&str)//赋值运算符的重载 { if

指针续

天涯浪子 提交于 2020-02-11 05:21:35
什么是指针 指针是一种数据类型(代表内存地址的整数),使用它定义的变量叫指针变量 为什么使用指针、什么情况下使用指针 1、函数之间无法通过传参共享变量。函数的形参变量属于被调用于者,实参属于调用者,函数之间的名字空间相互独立是可以重名的,函数之间的数据传递都是值传递(赋值、内存拷贝)。 2、使用指针可以优化函数之间传参的效率。 3、堆内存无法与标识符建立联系,只能配合指针使用。 如何使用指针 定义:类型 * 变量名p; 1、指针变量与普通变量使用方法有很大区别,一般以p结尾,与普通变量区分开。 2、* 表示此变量是指针变量,一个* 只能定义出一个指针变量,不能连续定义。 int* p1,p2,p3; (p1是指针,p2,p3是int变量) int *p1,*p2,*p3; (三个指针变量) 3、类型表示的是存储是什么类型变量的地址,它决定当通过地址访问这块内存时访问的字节数。 4、指针变量的默认值也是不确定,一般初始化为NULL(空指针)。 赋值:指针变量 = 地址 1、栈地址赋值: int num = 0; int * p = NULL; p = & num; 2、堆地址赋值: int * p = NULL; p = malloc(4); 解引用(根据地址访问内存):*指针变量名 <=> 变量 1、根据变量中存储的内存编号去访问内存中的数据,访问多少个字节要根据指针变量的类型。