首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中的左值和右值

C++中的左值和右值 学C++时间也不短了,突然发现,还不知道左值和右值是什么,毕竟学C++不够系统,详细。...下面是在许多博主中的博文中看到的一些相关解释: ---- 摘自《C++ Primer》第五版 C语言中,左值可以位于赋值语句的右侧,右值则不能。...当然,以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象(本人理解:功能不全的左值;除了自己的初始化,一般不用作左值使用。) 个人理解:左值一般和地址有关系。...左值和右值转换的一个重要原则:在需要右值的地方可以使用左值来替代,但是不能在需要左值(位置)的地方,使用右值。当然,也有一种例外的情况(参见P470,还没看到)。...P149:左值是指那些求值结果为对象或函数的表达式。一个表示对象的非常量左值可以作为赋值 关于运算符操作数和返回值的左右值 ?

2.4K30

C++中的左值和右值

在C/C++中,左值(lvalue)和右值(rvalue)是用于规定表达式(expression)的性质。C++中表达式要不然是左值,要不然是右值。...这两个概念在C语言中比较容易理解:左值能放在赋值语句的左边,右值不能。...但是当来到C++时,二者的理解就比较复杂了(PS:有对象真是麻烦) 简单的归纳: 当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份即在内存中的地址。...左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作。 在需要右值的地方可以用左值来代替,但是不能把右值当成左值使用。...关键是搞清楚,什么是右值,或者说什么不能用作左值(字面常量、&a的结果等等)。 举例来说: 赋值运算符需要一个(非常量)左值作为其左侧运算对象,最后得到的结果也是一个左值。

1.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

    函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 " 的基础 ; 一、函数返回值不能是 " 局部变量 " 的引用或指针 1、函数返回值常用用法 在 C++ 语言中 , 函数返回值...一般不会直接作为左值 , 因为 函数返回值是一个临时对象 , 一般情况下 都是当做右值使用 , 函数 返回的值都是 其 函数内部 局部变量 的 副本 , 这些 副本 不能作为左值参与赋值操作 ;...的代码中 , 强行给 函数 返回的 普通变量 的 副本值 进行复制 , 报 error C2106: “=”: 左操作数必须为左值 错误信息 ; 错误代码示例 : // 导入标准 io 流头文件 //...; 该 函数返回值 可以作为 正常的变量使用 , 既可以作为左值使用 , 又可以作为右值使用 ; // 返回静态变量引用 , 也就是静态变量自身 int& fun2() { static int...为其 赋值 100 , 然后打印 之前获取的 引用值 , 值也变为 100 ; 函数的引用返回值 可以作为 左值使用 ; 函数返回值 做 左值 代码示例 : // 导入标准 io 流头文件 // 其中定义了

    50930

    C++ 中的左值和右值

    一个变量有着具体(specific)的内存位置,所以他是一个左值。C++中声明一个赋值(assignment)需要一个左值作为它的左操作数(left operand):这完全合法。...下面是GCC给出的变异错误提示: error: lvalue required as left operand of assignment 赋值的左操作数需要一个左值,这里我们使用了一个右值666...我们也不能这样做: int* y = &666;// error~ GCC给出了以下错误提示: error: lvalue required as unary ‘&’ operand` &操作符需要一个左值作为操作数...三、返回左值和右值的函数 我们知道一个赋值的左操作数必须是一个左值,因此下面的这个函数肯定会抛出错误:lvalue required as left operand of assignment int...错误原因很清楚:setValue()返回了一个右值(一个临时值6),他不能作为一个赋值的左操作数。现在,我们看看如果函数返回一个左值,这样的赋值会发生什么变化。

    1.8K20

    【译】理解C和C++中的左值和右值

    关于左值和右值的理解: 赋值号左边的是左值,右边的是右值? 可以写在赋值号左边的是左值,否则是右值? 有明确内存地址的是左值,在内存中没有明确地址的是右值?...假设有一个int型变量,其声明和定义如下: int var; var = 4; 赋值操作要求一个左值作为其左操作数,var就是一个左值,因为var是一个int变量,在内存中有确定位置。...左值和右值之间的转化 通常来说,如果要构造一个对象,需要一个右值作为参数。...比如,解引用运算符“*”将使用一个右值作为操作数,但其结果是一个左值。...正如你们所想,右值引用和移动语义是及其复杂的一个分支,需要考虑一些特殊的场景和目标。笔者在这里只是简单的展示了在C++中左值和右值的区别。

    1.2K10

    【C++11特性篇】一文助小白轻松理解 C++中的【左值&左值引用】【右值&右值引用】

    【左值&左值引用】&【右值&右值引用】 【1】左值&左值引用 左值: 左值是一个表示数据的表达式 如: 变量名或解引用的指针 出现位置:左值 可以出现在赋值符号的左边,右边 性质1:左值可以 取地址+...可以对它赋值 性质2: 定义时const修饰符后的左值 , 不可以对它赋值 ,但是 可以对它取地址 左值引用: 左值引用就是给左值的引用,给左值取别名 int a = 0; int& r1 = a...int a = 0; int& r1 = a; } 【2】右值&右值引用 右值: 右值也是一个表示数据的表达式 如: 字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等、 出现位置: 右值可以出现在赋值符号的右边..., 但是不能出现出现在赋值符号的左边 性质: 右值不能取地址 普通右值&将亡值: 我们一般把右值分为如下两类: 普通右值 将亡值,例如:fun( ) 右值引用: 右值引用就是对右值的引用...因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。

    55810

    【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )

    进行了增强 , C++ 中 , 三目运算符表达式 返回的是一个 表达式 , 不是实际的值 , 而是表达式本身 ; 在 C++ 中 , 三目运算符 可以作为左值使用 , 就是为 返回的 表达式 赋值 ;...++ 中的 三目运算符 返回的事一个 内存空间地址 , 也就是 表达式变量 的 内存首地址指针 ; C++ 中的 三目运算符 返回值 , 既可以作为左值 , 又可以作为右值 ; 代码示例 : // 导入标准...---- C 语言的 三目运算符 返回的是计算完成之后的值 , 因此 该返回值 不能作为 左值使用 , 不能被赋值 ; C++ 语言中的 三目运算符 返回的事 变量本身 , 本质是第一个地址 , 可以被赋值..., 既可以作为左值 , 又可以作为右值使用 ; 有个特殊情况 : 如果 三目运算符 返回的是一个常量值 , 那么 C++ 中该返回值不能作为左值 , 也是会报错的 ; 一个表达式可以作为左值 , 那么该表达式必须有内存空间..., 如果让 三目运算符 返回的是 地址 , 那么在 C 语言中 , 可以使用指针为该地址赋值 , 就可以作为左值使用 ; 下面的代码中 , 令 三目运算符 返回 变量的地址 , 然后使用 指针 为该地址赋值

    55720

    C u002F C++ 中的运算符

    运算符是任何编程语言的基础。因此,如果不使用运算符,C/C++ 编程语言的功能是不完整的。我们可以将运算符定义为帮助我们对操作数执行特定数学和逻辑计算的符号。换句话说,我们可以说操作符操作操作数。 ...例如,在 C 或 C++ 中表示为 & 运算符的按位 AND将两个数字作为操作数,并对两个数字的每一位执行 AND。仅当两个位都为 1 时,AND 的结果才为 1。...赋值运算符:赋值运算符用于为变量赋值。赋值运算符的左侧操作数是变量,赋值运算符的右侧操作数是值。右侧的值必须与左侧的变量具有相同的数据类型,否则编译器将引发错误。 ...不同类型的赋值运算符如下所示:  “=” :这是最简单的赋值运算符。此运算符用于将右侧的值分配给左侧的变量。 ...: 三元条件 右到左 14 = 任务 右到左 += , -= 加法/减法赋值 *= , /= 乘法/除法赋值 %= , &= 模数/按位与赋值 ^= , = 按位异/包含 OR 赋值 <

    55630

    左值和右值、左值引用与右值引用、移动语句(2)「建议收藏」

    术语rvalue右值指的是存储在存储器中某个地址的数据值。 rvalue是一个不能赋值的表达式。文字常量和变量都可以作为右值。当左值出现在需要右值的上下文中时,左值将隐式转换为右值。...在C ++中,每个表达式都会产生左值,x值,(prvalue)rvalue或无值。 在C和C ++中,某些运算符需要一些操作数的左值。下表列出了这些运算符以及对其用法的其他限制。...= += -= *= %= >= &= ^= |= 左操作数必须是左值。 例如,所有赋值运算符都会计算其右操作数并将该值赋给其左操作数。 左操作数必须是可修改的左值或对可修改对象的引用。...地址运算符(&)需要左值作为操作数,而增量(++)和减量( – )运算符需要可修改的左值作为操作数。 以下示例显示表达式及其对应的左值。...要使语义正确,我们需要将左值绑定到非常量右值引用上,C++ 11提供了move函数来实现这种转换,因此我们可以修改为*this = move(s),这样move构造函数就会调用move赋值函数。

    2.6K20

    从零开始学习c++全套通关系列(第一章)万字总结,建议收藏~

    空字面常量(Null literal):表示空指针或无效值,用nullptr表示。字面常量在程序中直接使用,不需要额外的变量或声明,可以直接作为表达式的一部分使用。...四、变量在C++中,变量是程序中用于存储和操作数据的基本单元。变量可以通过指定类型、名称和可选的初始值来定义。...取模运算符 %:用于获取左操作数除以右操作数的余数。int remainder = 10 % 3; // remainder 等于 1 (10 除以 3 的余数)递增运算符 ++:用于增加操作数的值。...赋值运算符在C++中,赋值运算符(Assignment Operators)用于将右侧的值赋给左侧的操作数。赋值运算符是编程中最基本和最常用的运算符之一,主要用于给变量赋值。...a : b; // 因为 a 不大于 b,所以 max_value 等于 b,即 10在上面的示例中,a > b 是条件表达式,如果条件为真,则选择 a 的值作为结果,否则选择 b 的值作为结果。

    9810

    还分不清左值,右值,将亡值?看这里!

    来源:https://www.cnblogs.com/zpcdbky/p/5275959.html 编辑:公众号【编程珠玑】 C++中有“左值”、“右值”的概念,C++11以后,又有了“左值”、“纯右值...有一点需要说明,严格来讲,“左值”是表达式的结果的一种属性,但更为普遍地,我们通常用“左值”来指代左值表达式(正如上边一段中做的那样)。所谓左值表达式,就是指求值结果的值类别为左值的表达式。...它们事实上表征了表达式的属性,而这种属性的区别主要体现在使用上,如能否做运算符的左操作数、能否使用移动语义(关于移动语义,在下的后续文章中会详细介绍)等。...附注 事实上,将亡值不过是C++11提出的一块晦涩的语法糖。它与纯右值在功能上及其相似,如都不能做操作符的左操作数,都可以使用移动构造函数和移动赋值运算符。...注意foo函数的返回类型定义为X的引用,如果x为右值,那么,一个右值是不能绑定到左值引用上去的。 为避免这种情况的出现,C++规定:具名的右值引用是左值。

    6.1K30

    《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(自增自减、关系运算、逻辑运算、条件运算、位运算、赋值运算、类型转换)

    该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量,表达式为: condition ?...左操作数按位右移右操作数指定的位数 >>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。...= 左操作数加右操作数,结果赋值给左操作数 C += A即C = C + A -= 左操作数减右操作数,结果赋值给左操作数 C -= A即C = C - A *= 左操作数乘右操作数,结果赋值给左操作数...C *= A即 C = C * A /= 左操作数除以右操作数,结果赋值给左操作数 C /= A即C = C / A %= 左操作数对右操作数取模,结果赋值给左操作数 C %= 2即C = C % 2...结果赋值运算符 C >>>= 2即C = C >>> 2 &= 左操作数和右操作数按位与,结果赋值给左操作数 C &= 2即C = C & 2 ^= 左操作数和右操作数按位异或,结果赋值给左操作数 C

    77720

    C++の表达式与语句

    所谓单目运算符就是使用时只需要一个操作数,比如我们常见的取地址符(&),还有之前说到vector与array中的解引用运算符(*), 这个在C语言中,经常被用来取某个地址所存内容的值,因此又叫取值运算符...左值和右值 下面简单说一下左值与右值,我刚学习C++的时候,有一个感觉就是,左值?右值?傻傻分不清楚!...所以下面我一定要把这两个概念讲清楚,因为后面我们学到C++中的高阶用法时,这两个概念会时不时蹦出来, 其实一查,也没那么难。 C++表达式只可能是左值和右值其中的一种。...左值与右值是由一定的历史渊源的,它们继承自祖辈C语言,只不过C语言中的概念很简单:就是左值能放在赋值符号的左边,右值只能放在赋值符号的右边。...然鹅,C++中的就要复杂得多,在不同的符号前,它们的用法不用,比如: 赋值运算符、取地址符、内置解引用运算符、下标运算符等等,它们的用法都是不同的。

    32110

    Java赋值运算符的使用技巧,你Get了吗?

    简介  赋值运算符是将一个值赋给变量或表达式的运算符。在Java中,赋值运算符也是一种二元运算符,即它需要两个操作数:左操作数和右操作数。  ...除了基本的赋值运算符“=”之外,Java还提供了一系列复合赋值运算符,如“+=”、“-=”、“*=”、“/=”等。这些运算符可以将右操作数的值与左操作数进行运算,并将结果赋给左操作数。...然后,使用赋值运算符将 b 的值赋给 a。最后,我们使用一系列复合赋值运算符对 a 进行操作,并将结果输出到控制台。   需要注意的是,Java中的赋值运算符和C++中的赋值运算符是不同的。...例如,如果使用复合赋值运算符,可能会导致代码的可读性降低;如果使用赋值运算符时,左右操作数的类型不一致,可能会导致类型转换错误,从而引发异常。...在使用赋值运算符时,需要注意以下几点:赋值运算符的基本语法是“左操作数 = 右操作数;”复合赋值运算符可以将右操作数的值与左操作数进行运算,并将结果赋给左操作数;赋值运算符只能用于基本数据类型,不能用于自定义的数据类型

    29751

    【Modern C++】深入理解左值、右值

    作为C/C++开发人员,在平时的项目开发过程中,或多或少的听过左值和右值的概念,甚至在编译器报错的时候,遇到过lvalue和rvalue等字样;甚至使用过std::move(),但是不知道其含义。...作为多年的C++开发人员,一直以来,对左值右值的理解没有一个系统的认识,总感觉似懂非懂。...表达式 C/C++代码是由标识符、表达式和语句以及一些必要的符号(大括号等)组成。 表达式由按照语言规则排列的运算符,常量和变量组成。一个表达式可以包含一个或多个操作数,零个或多个运算符来计算值。...每个表达式都会产生一些值,该值将在赋值运算符的帮助下分配给变量。 在C/C++中,表达式有很多种,我们常见的有前后缀表达式、条件运算符表达式等。...左值具有以下特征: 可通过取地址运算符获取其地址 可修改的左值可用作内建赋值和内建符合赋值运算符的左操作数 可以用来初始化左值引用(后面有讲) 那么哪些都是左值呢?

    1K21

    【C++】类和对象之赋值运算符重载

    内置类型支持连续赋值,像下面这样 现将10赋值给j,然后这个表达式有一个返回值就是j,然后j再作为下一个返回值的右操作数,它有个返回值是i,这个i并没有再接收。 得注意运算符的优先级。..._day; } 要支持连续赋值就得有一个返回值,那么这里返回值是什么呢? 像d1=d2,d2赋值给d1,那么就返回d1。d2 = d3,就返回d2,也就是返回左操作数。..._day; return *this; } 这里不需要加const,规定的就是返回左操作数本身。 有时候可能会出现自己给自己赋值的情况。...C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给...把月小的一个加到和大的那个相同,直接算相差几年,相差几年就直接相成对应年的天数。里面有闰年也好计算。 假设左操作数大,右操作数小,如果假设错误,就重新赋值。

    13510

    【C++11】C++11新纪元:深入探索右值引用与移动语义

    C++11,作为这一进程中的一个重要里程碑,不仅带来了众多新特性,还深刻改变了C++编程的范式,其中右值引用(Rvalue References)无疑是最为引人注目的特性之一 在传统的C++编程中,我们习惯于通过左值...⛰️左值引用和右值引用 左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋 值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。...; } 左操作数必须为左值,否则就会报错 int main() { // 这里编译会报错:error C2106: “=”: 左操作数必须为左值 10 = 1; x + y = 1; fmin...那么这里就是一个移动语义 有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。...默认生成的移动构造函数,对于内 置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋 值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。

    10810

    开心档之C++ 运算符

    = 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。 > 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。...左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。 >= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。...左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。 实例 请看下面的实例,了解 C++ 中可用的关系运算符。...将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 A >> 2 将得到 15,即为 0000 1111 实例 请看下面的实例,了解 C++ 中可用的位运算符。...- c 的值是 15 赋值运算符 下表列出了 C++ 支持的赋值运算符: 运算符 描述 实例 = 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C +

    23230

    开心档之C++ 运算符

    = 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。 > 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。...左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。 >= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。...左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。 实例 请看下面的实例,了解 C++ 中可用的关系运算符。...将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 A >> 2 将得到 15,即为 0000 1111 实例 请看下面的实例,了解 C++ 中可用的位运算符。...- c 的值是 15 赋值运算符 下表列出了 C++ 支持的赋值运算符: 运算符 描述 实例 = 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C +

    24410

    【C++】运算符重载 ⑩ ( 下标 (int i) | 完整代码示例 )

    , 如果要使用下标访问 自定义 Array 类对象 , 需要重载 [] 下标运算符 ; 下面基于 博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h...[] ; operate[] 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] , 左操作数 :...其中 左操作数 是 a , 右操作数 : 运算符里面还有一个 int 类型的索引值 , 是右操作数 ; 如果是成员函数 , 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是...左操作数 ; 此时只需要额外指定一个 int 类型右操作数 即可 ; operator[](int i) 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 要对 Array...a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ; a[i] 除了获取值之外 , 还要可以设置值 ; a[i] 既可以作为左值 , 又要可以作为右值使用 ; 因此返回值必须是 int 值本身

    21130
    领券