今天师弟问到我关于“L_value”的概念这个概念如果分的话可以为左值、左值表达式。可以用一句话来表述,“可以放在赋值运算符左边的量或者表达式”。
这个理解起来有些困难,看到网上有个帖子写的还不错,转述如下:
左值通常不会是常量,字面量,一些临时变量(只存在一瞬间的变量).
比如:
const int A = 10;
A = 20; //错,不能是常量
10 = 20; //错,更不能是字面量
int a=1,b=2;
a+b=5; //错,也不能是只存在一瞬间的临时变量(a+b的和)
经过了这些规定,似乎左值就只能是普通变量了.其实不然,也是有左值表达式的(能在赋值号左边的表达式就称为左值表达式).
C语言中,最常见的左值表达式有,左自增,左自减,指针取内容.
例如:
++i=5;
--i=5;
int a,*p=&a;
*p=5; //*p其实也是表达式,因为它是由操作符(*),和操作数(p)组成.
以上的操作都是合法的;
而在C++中,左值表达式就不仅仅是上面这些,由于引用的存在,所以左值表达式可以是函数.
int& add10(int& a){
a+=10;
return a;
}
int main(){
int n = 1;
add10(n)=20; //完全可以.
return 0;
}
以上操作也是合法的。
看到这里大家应该对“L_value”有一定的认识,但是我们不可能列出所有左值或者左值表达式,我认为比较好的办法是,写一个判断程序,把一个变量或者表达式放在赋值符号的左边如果不出错,那就是“L_value”了。