c++左值与右值

在学c++过程中,左值与右值的概念是一道绕不过去的坎,因此就想写一些自己的理解。

左值(lvalue)与右值(rvalue)是C++语法中的术语(terms),第一次看到这两个词的时候,很自然就认为在一个表达式中,在等号左边的就是左值,在等号右边的就是右值。如果你们第一次看到这两个词也这么认为的话,那我要恭喜你们,说明你们离理解左值与右值的概念仅一步之遥了。也许有人会说这纯粹是调侃,其实不然,等我把前面说的话稍微升华一下,你就会发现其实也不无道理。

       前面说我第一次理解左值右值的时候,我提到了几个关键的词,分别是“表达式”,“等号”,“左边”,“右边”。你也许会很困惑我为什么要强调这几个词,其实在说左右值的时候,我们已经很自然的给它添加了一些限制。

首先,“表达式”就是左值与右值出现的地点,也就是说,无论我们何时谈到左值和右值,都必须与表达式联系起来。只有在表达式中,左右值才能体现它该有的属性意义。

其次,等号可以很自然让我们区分什么是左,什么是右。当然左值与右值的概念不可能仅仅只是靠等号的左右去区分的。但我们可以想想,等号左边是用来干嘛的?等号右边是用来干嘛的?聪明的你肯定会回答,等号左边是用来保存右边的值,等号右边是用来把值给左边的,即左边是用来被赋值的,右边用来赋值的。当想明白这点之后我们就可以假设,左值就是用来被赋值的,右值是用来赋值的。可是很快你就发现,如果这样想的话那岂不就一个值即可当左值,又可当右值?当我们将其放在左边,他就是左值,放在右边,即是右值,这岂不自相矛盾?要是没等号,我们要怎么区分左右值?的确是这样,所以我们回顾下我们目前为止所理解的左右值概念就会发现,对于“左值就是用来被赋值的”可以换成“能被赋值的就是左值”这样去描述,而“右值是用来赋值的”可以换成“不能被赋值的就是右值”这样去描述,这样我们就可以发现一切都说通了。而且左值与右值恰恰就是表示这样的意思。所以在c++中,你可以认为,变量都是左值,因为它们都可以被赋值。而对于不可赋值的字面值(literal value),临时变量等,他们就是右值,因为我们无法给它们赋值。

你是不是以为现在一切都结束了,其实还没完。如果再细细地去思考的话,就可以用一种更抽象的描述:能被取地址的值就是左值,不能被取地址的值即是右值。因为地址可以表示内存中一块空间的位置,有地址当然就说明在内存中有这块空间,这空间不仅可以存储当前值,还可以存储别的值,也即能被赋值。而不能被取地址说明在内存中没有这块空间,即无法给它赋值。

你可能感兴趣的:(C++)