下面的代码,大家猜下结果分别是多少?
#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),所以编译器报错。
总结:
自增后不能作为左值进行操作,而解引用后可以作为左值进行操作。
本文通过两个示例探讨了C语言中自增运算符的行为差异。解析了为什么某些表达式会导致编译错误,以及如何正确地使用这些运算符。特别强调了解引用后才能作为左值进行操作的重要性。

3749

被折叠的 条评论
为什么被折叠?



