如何辨析左值和右值

(左值)=(右值)
赋值操作应该在编程中占有很大一部分,不少人赋值还因为左右值的问题导致程序出现bug,其实只要把它们的本质搞清,你就不容易出错了。
总结来说,左值不能为常量,左值可以为一块空间,而右值一般为常量或一块空间

看下面的一段代码:

char ch='a';
char *cp=&ch;
//首先必须理解的是cp的地址ch的地址不是同一块地址,\
cp的存储的值是ch的地址,对cp解引用是ch地址的值,即'a'
++或--的优先级高于*(解引用)

观察下面表达式什么意思?,能作左值或右值吗?

&ch; //&ch是地址常量,不能为左值,可以为右值
cp; //cp是变量,代表ch的那块空间,可为左值和右值
&cp; //&cp也是地址常量,不能为左值,可以为右值


*cp+1; //代表ch下一个char 空间的值,为常量,不能为左值,可为右值
*(cp+1); //代表ch下一个char 空间,为常量,可以为左值,可为右值


++cp; //为地址常量,不能为左值,可以为右值
cp++; //为地址常量,不能为左值,可以为右值
+


*++cp; //代表ch下一块空间,可为左值和右值
*cp++; //同上,可为左值和右值


++cp; //虽然++优先级高于,但这里*离cp最近,先*cp,这里代表ch值的下一个值,不能为左值,可为右值
(*cp)++; //同上,


++*++cp; //表示ch的下一个地址的值再加一,此时这个空间的值未知,若要访问,可能会出错,ch的值没改变,不能作左值,可以作右值
++*cp++; //表示ch的空间的内容再加一,ch的值已改变,不能作左值,可以作右值
请自行体会下面的代码:
这里写图片描述
这里写图片描述


总结:解引用一个地址后再++或– 操作不能为左值,如*cp+1 ,++*cp, (*cp)++, 一个表达式最后一次运算为解引用时,那么这个表达式可以作左值和右值。

猜你喜欢

转载自blog.csdn.net/yc1515707718/article/details/79294600