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
左值,无效
浙公网安备 33010602011771号