《c和指针》笔记--a++和++a不是变量

#include <stdio.h>
#include <stdlib.h>

int main(void){
        int i=0,j=0;
        i++ = 10;
        ++j = 10;
        return EXIT_SUCCESS;
}

上面的编译时会出现一下错误:

aplus2.c:6:6: error: lvalue required as left operand of assignment
aplus2.c:7:6: error: lvalue required as left operand of assignment

意思就是等号左侧应该是应该是一个变量


书上有这个几句话:

前缀和后缀形式的增值操作符都赋值一份变量值的拷贝,用于周围表达式的值正是这份拷贝。

前缀操作符在进行赋值之前增加变量的值,后缀操作符在进行赋值之后才增加变量的值。


对于这几句话,我的理解是:

比如i++ = 10这句,先将i的值进行复制到i++(可以将i++看成值10的别名),然后再对i加1,所以这句语句执行完后,i的值是11,而i++的值是10。

同理,++i = 10这句,先对i加1,然后再将i的值复制到++i(可以将++i看成值11的别名),所以这句语句执行完后,i和++i的值是11。


++i和i++的结果是i值的拷贝,并不是变量本身,所以无法向一个值进行赋值。

### 比较两个C语言指针操作表达式 在分析 `*a++ = *b++;` `*a++ = *b + 2;` 这两条语句之前,先理解每条语句中的各个部分。 #### 表达式解析 对于第一条语句 `*a++ = *b++;`: - 解析顺序是从右向左执行。首先解引用并读取 `b` 所指向位置的内容,然后将该值赋给由 `a` 当前所指向的位置。 - 接着分别对 `a` `b` 应用了自增运算符 (`++`),这意味着这两个指针都会移动到下一个地址位置[^1]。 对于第二条语句 `*a++ = *b + 2;`: - 同样地,这条语句也会把某个值写入 `a` 正在指向的地方之后使 `a` 自身前进一位。 - 不过这里不是简单复制 `b` 的当前所指内容而是加上了一个常数偏移量 `2` 来计算新值再进行存储。 #### 关键差异 主要区别在于如何处理右侧的操作对象以及最终被存放到左侧内存单元的具体数值上: - 在第一个例子中,直接交换了两个变量之间的数据而没有改变其原始值;而在第二个例子中,则是在源地址的基础上进行了算术调整后再做分配。 - 另外需要注意的是,在这两种情况下的副作用都是相同的——即每次迭代后更新后的指针都向前推进了一格。 ```c int a[] = {0, 1}; int b[] = {2, 3}; // Example of first expression *a++ = *b++; printf("%d %d\n", a[-1], b[-1]); // Output depends on initial values. // Reset pointers... a -= 1; b -= 1; // Example of second expression *a++ = *b + 2; printf("%d %d\n", a[-1], b[0]); ``` 上述代码片段展示了两种不同方式下指针行为的实际效果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值