什么是左值和右值

第一次让左值右值引起我注意的时候是在刚接触字符串和指针的时候编译器对代码的一段错误提示

那什么是左值(l-value)那:

说的通俗一点就是可以放在赋值号左边的叫左值 就是可以被赋值的。是一个地址

左值一般是是一个变量可以被赋值的变量。(const变量是一个例外只能做右值)

那什么是右值(r-value)那:

同样我们可以说是可以放在赋值号右边的 就是可以给其他变量赋值的,

它可以是一个变量也可以是一个常量也可以是一个表达式。是一个内容

例如:

#include<stdio.h>

int main()
{
    char name[20];
    char *adress;
    name="小明";   //错误的
    adress="南极";  //正确的
 } 

name="小明";

这个语句中 字符数组 name 就不是一个左值 因为name 在定义的时候它是被分配道内存的栈中,

而 "小明" 是存储在内存的静态常量中 ,它在赋值的时候是将这个静态区的常量的首地址赋給一个指针变量,

所以name 字符数组不能做这里的左值 而且 name 本质上是一个数组 是将每个字符存储在单元格中 ,

虽然在按字符串格式输出的时候是一段字符串,但是实际上它本质上也是一个一个字符组到一起的。

如果要把一段字符串存储在字符数组中就需要把一个一个字符存储在数组中。

什么是表达式:
表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。较复杂的表达式则由操作符以及一个或多个操作数构成。

一个变量是表达式但是一个表达式就不一定是变量了。

确切一点说一个简单的赋值语句

左值是一个地址 左值是左侧表达式所代表的地址

右值是右侧表达式所代表的内容。

但左值并不一定能被赋值,因为左值可以引用某个常量。 所有的引用都是左值。
右值是表达式的值(不是引用),可以放在赋值右面。

所以所有左值都可以做右值。

函数的引用参数
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制。在按值传递时,函数操纵的是实参的本地拷贝。当参数是引用时,函数接收的是实参的左值而不是值的拷贝。
这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。

时间: 2024-10-06 02:24:59

什么是左值和右值的相关文章

(C++)关于i++和i++的左值、右值问题

1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值,但右值不可以是左值. 因此也只有左值才能被取地址. 2.举两个问题: int i = 0; (i++)+=i; //错误 (++i)+=i; //正确 int *ip = &(i++); //错误 int *ip = &(++i); //正确 3.为什么i++不能作左值? 我们来看i++和i

c++中的左值与右值

++(a++) a++相当于 int a; { int temp=a; a++; teturn temp; } 所以我们可以将++(a++)看成++temp;而temp 显然是一个右值,所以不能用啊~~ L-value中的L指的是Location,表示可寻址.The "l" in lvalue can be though of as locationR-value中的R指的是Read,表示可读.The "r" in rvalue can be thought of

C 语言中的左值和右值。以及对比数组名和指针取数组元素的区别。

左值:出现在赋值符左边的符号有时称为左值. 右值:出现在赋值符右边的符号有时称为右值. 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,而且该变量在运行时一直保存于这个地址.相反,存储于变量中的值(它的右值)只有在运行时才可知.如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器. 可以看到,每个符号的地址在编译时可知. 对比一下几个式子: //常规变量 int a=1;//这里a作为左值出现,代表的是地址,即在a表示的这个内存地址存入数值1.即a代表的内

C++11之右值引用:从左值右值到右值引用

C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是可以取得内存地址的变量. 非左值即为右值. 从这里可以看出,可以执行&取地址的就是左值,其他的就是右值. 这里需要明确一点,能否被赋值不是区分C++左值和右值的区别. 我们给出四个表达式: string one("one"); const string two("two&

4.1 中的左值和右值

摘要:  引自---http://www.cnblogs.com/catch/p/3500678.html 左值 (lvalue)和右值 (rvalue) 是 c/c++ 中一个比较晦涩基础的概念,有的人可能甚至没有听过,但这个概念到了 c++11 后却变得十分重要,它们是理解 move, forward 等新语义的基础. 左值右值的定义 左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析 by 小威威 1. 知识引入 在C++编程中,动态分配的内存在使用完毕之后一般都要delete(释放),否则就会造成内存泄漏,导致不必要的后果.虽然大多数初学者都会有这样的意识,但是有些却不以为意.我曾问我的同学关于动态内存的分配与释放,他的回答是:"只要保证new和delete成对出现就行了.如果在构造函数中new(动态分配内存),那么在析构函数中delete(释放)就可以避免内存泄漏了!" 事实果真如此么?

c++11の的左值、右值以及move,foward

左值和右值的定义 在C++中,可以放到赋值操作符=左边的是左值,可以放到赋值操作符右边的是右值.有些变量既可以当左值又可以当右值.进一步来讲,左值为Lvalue,其实L代表Location,表示在内存中可以寻址,可以给它赋值(常量const类型也可以寻址,但是不能赋值),Rvalue中的R代表Read,就是可以知道它的值.例如: int a=3; a在内存中有地址,而3没有,但是可以read到它的值. 3=4; 这个是错误的,因为3的内存中没有地址,不能当作左值. 下面这个语句不容易出错 a++

c/c++左值和右值

C/C++中的变量有左值和右值之分,他们的区别主要如下: (1)左值可以放在赋值号 = 的左右两边,右值只能放在赋值号 = 的右边 (2)在C语言中,有名字的变量即为左值:而函数的运行结果或表达式中间变量即为右值 (3)对于内嵌类型(基本类型,即built-in types),右值是不可以被更改的,也不可以被const,volatile所修饰: 对于自定义类型,右值却可以通过它的成员函数来进行修改. (4)左值也可以作为右值表达式,变量可以是左值,也可以为右值,但常量只能是右值. (5)右值只能

[转] 左值和右值

http://www.cnblogs.com/dejavu/archive/2012/09/02/2667640.html#commentform <C/C++> 左值和右值, L-value和R-value 一直以为左值是可以出现在赋值表达式左边(the left side of an assignment expression)的值,Left-value;右值即Right-value. 今天看到一个说法,觉得有点味道: L-value中的L指的是Location,表示可寻址. The &q

C++中的左值和右值

左值和右值的定义 在C++中,可以放到赋值操作符=左边的是左值,可以放到赋值操作符右边的是右值.有些变量既可以当左值又可以当右值.进一步来讲,左值为Lvalue,其实L代表Location,表示在内存中可以寻址,可以给它赋值(常量const类型也可以寻址,但是不能赋值),Rvalue中的R代表Read,就是可以知道它的值.例如: int a=3; a在内存中有地址,而3没有,但是可以read到它的值. 3=4; 这个是错误的,因为3的内存中没有地址,不能当作左值. 下面这个语句不容易出错 a++