HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

左值与右值

Posted on 2011-09-20 00:47  光铭  阅读(346)  评论(0)    收藏  举报
1 char ch = 'a'
2 char *cp = &ch;

简单的来讲,左值用来存储数据,右值就是要存储的值

下面的地址不是严格意义上的地址,详见Pointers on C

现在我们来观察ch

当ch作为右值使用时,表达式的值为'a'

当ch作为左值使用时,表达式的值是存放ch内存的地址

现在观察&ch
&ch作为右值,表示ch的地址 

&ch作为左值,不合法,因为&ch进行求值时,它的结果肯定会存放在内存中的某位置,但是存放在哪里呢?不知道。这个表达式并没有标识内存中的特定位置,所以
它不是一个合法的左值。 

现在观察cp

cp作为右值,表示&ch,ch的地址
cp作为左值,表示ch作为一个指针变量的内存地址

现在观察&cp

&cp作为右值,表示cp的内存地址

&cp作为左值,不合法,因为和&ch一样的原因

现在观察*cp

*cp作为右值,表示ch的值,'a'

*cp作为左值,表示ch的内存地址 

现在观察*cp+1

*cp+1,右值,表示'a'+1,为b

*cp+1,左值,不合法,因为计算机对*cp+1进行了计算,但是把结果放在了一个不确定的位置。和前面一样的原因。

现在观察*(cp+1)

右值,表示紧跟在ch后面的一个字节存储的值(如是是指向double的指针就是8个字节)

左值,表示紧跟在ch后面的一个字节的地址(如果是指向int的指针就是4个字节)

现在观察++cp

右值,紧跟在ch后面一个字节的地址,前缀++先增加操作数再返回结果

左值,无效

现在观察cp++

右值,ch的地址,后缀++先返回结果再增加操作数

左值,无效

现在观察*++cp

很简单,不观察了

现在观察*cp++

++后缀优先于*操作符

这里有三个步骤(1)++操作符产生cp的一份拷贝(2)++操作符增加cp的值(3)在cp的拷贝上执行间接访问操作

右值,ch的值

左值,ch的地址

++*cp

右值,ch的值加1,b

左值,无效(形如 int a = 1; a++或者++a当左值都是无效的,++操作符返回的是一份拷贝,拷贝放在哪了不知道)

(*cp)++

右值,a

左值,无效

++*++cp

右值,ch后面的一个字节的值+1

左值,无效