《c和指针》笔记--表达式作为左值或右值

来源:互联网 发布:淘宝怎么加入淘客 编辑:程序博客网 时间:2024/06/06 00:22

下面的代码,大家猜下结果分别是多少?

#include <stdio.h>int main(void){        int i=1;        int* cp = &i;        printf("%d\n",++*cp++);        return 0;}


#include <stdio.h>int main(void){        int i=1;        int* cp = &i;        printf("%d\n",++(*cp)++);        return 0;}


答案:

第一个值是:2

第二个在编译时出现错误: 

error: invalid lvalue in increment


分析:

++*cp++:

cp++执行后,不会影响当前表达式中cp的值,然后执行*cp,值是1,最后进行前自增(此时*cp++作为左值),结果为2.


++(*cp)++:

指针cp进行解引用,值是1,然后进行后自增,值不变,还是1,最后进行前自增,但是此时(*cp)++不能作为左值,因为(*cp)++是值的拷贝,不是变量(详细可以参考之前写过的一片文章:http://blog.csdn.net/todd911/article/details/8860960),所以编译器报错。


总结:

自增后不能作为左值进行操作,而解引用后可以作为左值进行操作。