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

【编程经验】C语言中左值和右值的区别

在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!...变量做左值和右值的区别: 如 x = 2; 这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。...常量做左值和右值的区别 继续 x = 2; 这里2做右值, 2是一个常量,没有任何疑问。 而如果 1 = 2; 这里我们看左值,是1是常量,这里就会有问题了,编译会报错!...因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。 ?...而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的! ?

1.5K60

【编程经验】C语言中左值和右值的区别

黄老师原创精品文章哦~ 在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!...1.变量做左值和右值的区别: 如 x = 2; 这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。...因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。 ?...而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的! ?...就就是char * p = “dotcpp.com”;用法的原因。 以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论! C语言研究中心(www.dotcpp.com)

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

    Google C++ 编程风格指南(八):格式

    代码风格和格式确实比较随意, 但一个项目中所有人遵循同一风格是非常容易的. 个体未必同意下述每一处格式规则, 但整个项目服从统一的编程风格是很重要的, 只有这样才能让所有人能很轻松的阅读和理解代码....对基本条件语句有两种可以接受的格式. 一种在圆括号和条件之间有空格, 另一种没有. 最常见的是没有空格的格式. 哪种都可以, 但 保持一致性. 如果你是在修改一个文件, 参考当前已有格式....在单个文件内要保持风格一致, 所以, 如果是修改现有文件, 要遵照该文件的风格. 8.11. 布尔表达式 如果一个布尔表达式超过 标准行宽, 断行方式要统一一下....函数返回值 return 表达式里时没必要都用圆括号。 假如您写 x = epr 时本来就会加上括号,那 return expr; 也可如法炮制。...关于 UNIX/Linux 风格为什么要把左大括号置于行尾 (.cc 文件的函数实现处, 左大括号位于行首), 我的理解是代码看上去比较简约, 想想行首除了函数体被一对大括号封在一起之外, 只有右大括号的代码看上去确实也舒服

    1.7K30

    深入理解C++11右值引用与移动语义:高效编程的基石

    Lambda 表达式:引入了 Lambda 表达式,使得 C++ 具备了更现代化的函数式编程能力。...在C++中,左值(Lvalue)和右值(Rvalue)是表达式类型的重要概念。它们决定了表达式的“值类别”,即表达式的结果可以用于什么类型的操作,比如赋值、地址取用等。 1....左值(Lvalue) 左值(Lvalue,Locator value)是一个可以取地址的表达式,表示一个持久的、可命名的存储位置。它可以出现在赋值运算符的左边,也就是说,它是可以被赋值的对象。...示例:变量、数组元素、解引用的指针等。 用法:左值通常用于表示可以被修改的对象,但需要注意的是,有些左值可能是const的,即使是左值也不能修改。...不过在函数体中,调用了 Fun(t); 这一语句,**而此时的 t 却是完完全全的一个左值,因为右值引用变量的属性会被编译器识别成左值,否则在移动构造的场景下,无法完成资源转移,必须要修改。

    12910

    Shell编程汇总——持续更新

    Shell编程汇总 一、变量说明 二、变量和符号 三、命令 0.dos2unix 1. which 2. cron 3. grep 4. && || 5. sed 6. setfacl 四、信息安全 〇...if 参数 # 当file存在并且是块文件时返回真 –b # 当file存在并且是字符文件时返回真 -c # (*)当pathname存在并且是一个目录时返回真 -d # 当pathname...但要注意: 1)必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错; 2)test命令使用标准的数学比较符号来表示字符串的比较,而改用文本符号来表示数值的比较。...3)大于符号或小于符号必须要转义,否则会被理解成重定向。 (()) [[]] 分别是[]针对数学比较表达式和字符串表达式的加强版。...--set 和 --set-file用来设置文件或目录的acl规则,先前设定的脚背覆盖。 -m (--modify) 和 -M (--modify-file)修改文件或目录的acl规则。

    79310

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

    Lvalues和xvalues可以是不完整的类型,但是(prvalue)rvalues必须是完整类型或void类型。 对象是可以检查和存储的存储区域。左值或x值是引用此类对象的表达式。...左值不一定允许修改它指定的对象。例如,const对象是无法修改的左值。术语可修改的左值用于强调左值允许指定的对象被改变以及被检查。...左值并不一定出现在表达式的左边: 以下对象类型是左值,但不是可修改的左值: 数组类型 不完整的类型 const限定类型 结构或联合类型,其成员之一被限定为const类型 因为这些左值不可修改,所以它们不能出现在赋值语句的左侧...= += -= *= %= >= &= ^= |= 左操作数必须是左值。 例如,所有赋值运算符都会计算其右操作数并将该值赋给其左操作数。 左操作数必须是可修改的左值或对可修改对象的引用。...地址运算符(&)需要左值作为操作数,而增量(++)和减量( – )运算符需要可修改的左值作为操作数。 以下示例显示表达式及其对应的左值。

    2.6K20

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

    这个操作符主要用于泛型编程中,特别是在模板编程中,当需要推导表达式的类型但又不想实际执行该表达式时,decltype 显得尤为有用 代码示例 (C++): int main() { const int...右值引用和移动语义 右值引用 在C++中,表达式根据它们是否可以被修改分为左值(lvalue)和右值(rvalue)。左值是可以被取地址的表达式,通常对应于具有持久状态的实体(如变量)。...⛰️左值引用和右值引用 左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋 值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。...; } 左操作数必须为左值,否则就会报错 int main() { // 这里编译会报错:error C2106: “=”: 左操作数必须为左值 10 = 1; x + y = 1; fmin...(x, y) = 1; } 注意: 不能用一个值能不能修改来区分左右值,右值是不能取地址的 给右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址 左值引用与右值引用比较 左值引用: 左值引用只能引用左值

    10610

    【c++11】列表初始化与声明

    它的能力远超 auto,可以精确地获取表达式的类型,尤其适合处理复杂类型和左值/右值差异的场景。 1. 定义与作用 decltype 的功能是检查一个表达式的类型,并返回该类型。...int,因为 a + b 是 int decltype((a)) ref_a = a; // ref_a 的类型为 int&,因为 (a) 是左值表达式 ++ref_a;...// 修改 ref_a 会影响 a std::cout << a << " " << sum << std::endl; // 输出 11 30 return 0; } 注意: 如果表达式是左值...与 auto 的区别 特性 auto decltype 用法 推导变量的类型 推导表达式的类型 推导方式 推导为值类型 区分左值和右值,左值推导为引用类型 示例 auto x = a; decltype...注意事项 左值和右值的差异: decltype((a)) 是左值表达式,推导为引用类型。 decltype(a) 是右值表达式,推导为值类型。

    13710

    左值、右值与常引用

    代码编译运行环境:VS2017+Win32+Debug ---- 1.左值的定义 左值(Lvalue)是C++中的一个基本概念,指可寻址的非只读表达式。...理解左值的概念,需要注意一下几点: (1)左值一定是可以寻址的表达式,不能寻址的表达式不能作为左值。例如,表达式3+5是一个符号常量表达式,它不能被寻址,因此就不能作为左值。...在这种情况下,必须修改函数Max()的定义,也就是把它的参数声明为常引用:int Max(const int& a, const int&b),这样就解决问题了。...可见,将函数的参数声明为常引用,不完全是因为参数的值在函数体内不能修改,还考虑了接受非左值作为函数实参的情况。...---- 参考文献 [1]C++高级进阶教程.陈刚.武汉大学出版社.1.9左值的概念 [2]C专家编程(中文版).第4章

    1.1K10

    C语言介绍

    美国计算机科学家,对C语言和其他编程语言、Multics和Unix等操作系统的发展作出了巨大贡献。...[18] 4、表达方式灵活实用 C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。...先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2.13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。...表达式3为循环控制变量修改表达式,它使for循环趋向结束。 循环体语句是在循环控制条件成立的情况下被反复执行的语句。...C程序中函数的数目实际上是不限的, 如果说有什么限制的话, 那就是, 一个C程序中必须至少有一个函数, 而且其中必须有一个并且仅有一个以main为名, 这个函数称为主函数, 整个程序从这个主函数开始执行

    3.1K20

    运算符和表达式

    更普遍地,C使用术语“可修改的左值”(modifiable Ivalue)来标志那些我们可以为之赋值的实体。“可修改的左值”或许不是那么直观易懂,所以我们先看看一些定义。...因为不是所有的对象都是可更改值的,所以C使用术语”可修改的左值“来表示那些可以被更改的对象。所以,赋值运算符的左值应该是一个可修改的左值。...lvalue中的l确实是英文单词left的意思,因为可修改的左值可以用在赋值运算符的左边。 术语"右值"(rvalue)指的是能赋给可修改的左值的量。...例如,考虑下面的语句: num=2014; 这里是一个可修改的左值,2014是一个右值。您可能猜到rvalue中的r表示right。右值可以是常量、变量或者任何可以产生一个值的表达式。...我们可以把变量理解为一个容器,放在左边当左值时,意思为保存、存放右边的值。所以,我们可以说=运算符的左操作数是可修改的左值。

    65630

    【深度剖析 C++11】 第二弹: 现代C++ 的关键版本和核心驱动

    泛左值(glvalue),泛左值包含将亡值(xvalue)和 左值(lvalue)。 2.1、纯右值:(prvalue) 纯右值是表达式求值过程中产生的临时值,或者用于初始化对象的字面量等。...C++ 中的一个重要概念,它主要出现在模板编程和类型推导的上下文中。...4、完美转发 4.1、使用场景 上节课我们讲过,变量表达式都是左值属性,也就意味着⼀个右值被右值引用绑定后,右值引用变量在用于表达式时的属性是左值!!!...,传递给func时只会匹配左值引用的版本 //因为右值变量在用于表达式时的属性是左值!!...当使用混合捕捉时,第⼀个元素必须是 &或=,并且&混合捕捉时,后面的捕捉变量必须是值捕捉,同理=混合捕捉时,后面的捕捉变量必须是引用捕捉。

    9110

    Java代码规范

    PATH_MANIPULATION 前言 好代码的标准(公司顺序) 简洁:易于理解、易于实现; 可维护:软件被修改的能力,包括纠错、改进、新需求或功能规格变化的适应能力; 可靠:软件在给定时间间隔和环境条件下...(6)合并重复的条件片段 (7)正确使用临时变量(命名规范) 第一章 JAVA语言编程规范总则 本规范总则的示例采用以下的术语描述: ★ 规则:编程时强制必须遵守的原则。...★ 建议:编程时必须加以考虑的原则. ★ 格式:对此规范格式的说明。 ★ 说明:对此规则或建议进行必要的解释。 ★ 示例:对此规则或建议从正、反两个方面给出例子。...*较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。...在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在Java语言中括号已经是最清晰的标志了。

    1.2K10

    C++ 中 const 和 constexpr关键字解析:常量、函数和指针

    很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误,表达式必须是可修改的左值...num) { // 错误,表达式必须是可修改的左值,意思就是参数num是个常量,无法修改 num = 3; } 修饰指针 虽然指针也是一种变量,不过当const与指针出现在一起的时候...表达式必须是可修改的左值 *p = 3; // 正确 a = 4; // 4 cout << *p << endl; // 同样地,有人习惯这种写法,作用是一样的,看个人喜好即可 int const...*p2 = &a; // 第二种情况:常量指针 int a = 2; // const作用:使指针p无法指向其他变量 int* const p = &a; int b = 3; // 错误,表达式必须是可修改的左值...{ public: void test() const { // 错误,表达式必须是可修改的左值,因为member是成员变量,而test函数被const修饰过后无法修改成员变量

    98420

    【编程经验】基本运算符

    更普遍地,C使用术语“可修改的左值”(modifiable Ivalue)来标志那些我们可以为之赋值的实体。“可修改的左值”或许不是那么直观易懂,所以我们先看看一些定义。...所以对象指的是实际的数据存储,但是左值是用于识别或定位那个存储的标识符。 因为不是所有的对象都是可更改值的,所以C使用术语”可修改的左值“来表示那些可以被更改的对象。...所以,赋值运算符的左值应该是一个可修改的左值。lvalue中的l确实是英文单词left的意思,因为可修改的左值可以用在赋值运算符的左边。...术语"右值"(rvalue)指的是能赋给可修改的左值的量。例如,考虑下面的语句: num=2014; 这里是一个可修改的左值,2014是一个右值。您可能猜到rvalue中的r表示right。...右值可以是常量、变量或者任何可以产生一个值的表达式。 我们可以把变量理解为一个容器,放在左边当左值时,意思为保存、存放右边的值。所以,我们可以说=运算符的左操作数是可修改的左值。

    821110

    C++值类别概述

    现代C++中,引入了左值右值的概念,用于区分不同类型的表达式和值,而后又进一步的引入了将亡值和纯右值的概念,左值和将亡值统称为泛左值;纯右值和将亡值统称为右值。...左值 左值是具有变量名的表达式,它具有持久的内存地址,可以被取地址、引用和修改。 其通常用于表示具体的对象或变量,在 C++ 中最常见的表达式类型之一。...将亡值 将亡值是一种即将要被销毁的值,但仍然可以被引用的右值。将亡值通常发生在对象即将离开作用域、被移动(move)或转换为另一个类型时。它可以被引用,并且仍然处于可移动状态。...左值和将亡值都属于泛左值。 总结 《Effective Modern C++》指出若能取得该表达式的地址,那么该表达式基本可以断定是左值。如果不能取得表达式的地址,则其通常为右值。...参考: 《Effective Modern C++ 中文版》高博译 《C++20 高级编程》 罗能著

    12110

    【笔记】《深入理解C++11》(上)

    才疏学浅, 错漏在所难免, 后续若有所修改会同步存于我的Github仓库, 点击底部"阅读原文"可跳转(Study-Notes/Content/《深入理解C++11》笔记/上 at main · ZFhuang...如果使用委派构造, 就必须在构造函数体中进行其余成员的初始化 一种解决方案是修改构造的顺序, 让参数最多的构造函数作为委派构造的最终目标, 然后在这个构造函数的初始化列表中完成成员初始化....右值引用形成的拷贝/赋值函数称为移动拷贝/赋值, 核心是直接窃走目标对象内部指针指向的内存内容, 然后置空目标对象的指针 无论声明了左值引用还是右值引用, 都必须在声明时立即初始化(参数列和初始化列表也算立即初始化...但注意右值引用不能被绑定到左值 右值引用能够延长右值的声明周期, 常量左值引用属于万能引用, 也能够延迟生命周期, 但是常量左值引用后的值不能修改所以一般用来减少临时对象的开销而已 当类没有定义移动构造时...如果目标是被重载的函数则编译错误 否则, 对于带括号的表达式, 如果目标是将亡值, 那么返回右值引用 对于带括号的表达式, 如果目标是左值, 返回左值引用 否则返回目标本身类型 推导四规则中最麻烦的是规则

    2K20

    C++补充知识&C++11及其特性

    左值和右值的概念 按字面意思,通俗的说,以赋值运算符=为界,左边的就是左值,右边的就是右值。 左值(lvalue)——代表一个在内存中占有确定位置的对象(就是有一个地址)。...右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存中占有确定位置的表达式,而是在存在寄存器中。 所有的左值(无论是数组,函数或不完全类型)都可以转化成右值。...函数返回值当引用 C++使用引用时的难点 当函数返回值为引用时 若返回栈变量,不能称为其他引用的初始值,不能作为左值使用。...返回形参当引用 (注:C++链式编程中,经常用到引用, 例如运输符重载) Array容器 详见-C++SLT容器中。...除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。(低级别:在内存没啥差别) 与static_cast相加可替换掉C风格的类型转换。

    40510
    领券