如果我写下面这样的代码?
int arr[] = {6, 7, 8, 9, 10};
int *ptr = arr;
*(ptr++)+= 123;
现在 arr[] 中的元素是什么?
我原本以为 arr[] 现在应该是 {6, 130, 8, 9, 10},但实际上结果是 {129, 7, 8, 9, 10},我不知道为什么?
在我看来,ptr++在括号里,所以ptr应该先增加,不是吗?在它增加一个之后,它应该指向数组中的第二个元素。
如果我写下面这样的代码?
int arr[] = {6, 7, 8, 9, 10};
int *ptr = arr;
*(ptr++)+= 123;
现在 arr[] 中的元素是什么?
我原本以为 arr[] 现在应该是 {6, 130, 8, 9, 10},但实际上结果是 {129, 7, 8, 9, 10},我不知道为什么?
在我看来,ptr++在括号里,所以ptr应该先增加,不是吗?在它增加一个之后,它应该指向数组中的第二个元素。
的值ptr++
是ptr
任何增量之前的值(副作用是ptr
在表达式评估期间的某个时间递增)。
那是在 中取消引用的值*(ptr++)
。
如果您ptr
在后续表达式中取消引用,它将指向下一个元素,即具有 value 的元素7
。
如果您想要您期望的行为,请使用++ptr
(即预增量)。括号不影响后增量发生的时间。换句话说,它与优先级无关。
这个ptr++的效果只会在';'之后发生 ptr++ 等价于 ptr = ptr + 1; 但这只会在该语句的分号后完成。ptr 值将在操作期间为 arr[0] *(ptr++)+= 123; 但在该语句之后 ptr 将等同于 arr[1]
ptr++的基本含义是先使用后增量,这就是它被称为后增量运算符的原因。这意味着变量 ptr 的值只有在当前指令执行完毕并且在后续指令中再次使用时才会更新。
而++ptr正好相反,它是First Increment 然后使用,它被称为Pre Increment Operator。