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

本文通过两个示例探讨了C语言中自增运算符的行为差异。解析了为什么某些表达式会导致编译错误,以及如何正确地使用这些运算符。特别强调了解引用后才能作为左值进行操作的重要性。

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

#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),所以编译器报错。


总结:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值