指针的前/后增量

3

这两个表达有什么不同:

(*x)++

并且

++(*x)

我可以看出这两个语句都替换了*x中(*x+1)的内容。但是它们之间有什么区别吗?

3
使用printf与它们一起使用。 - Krishnabhadra
可能是 ++ on a dereferenced pointer in C? 的重复问题。 - dirkgently
@dirkgently 错误的重复(虽然我猜这个问题也有一个真正的重复在某个地方)。 - Christian Rau
4个回答

7
(*x)++的值为*x,并将*x的值加1作为副作用。
++(*x)的值为*x + 1,并将*x的值加1作为副作用。
假设代码如下:
int a = 5;
int *x = &a;

(*x)++ 的结果为 5,而 ++(*x) 的结果为 6

需要注意的是,在表达式求值后副作用不必立即应用;它只需要在下一个序列点之前应用。

还要注意对于 (*x)++ 括号的位置很重要;后缀 ++ 的优先级高于一元运算符 *,因此 *x++ 会被解析为 *(x++);它仍然将求出 *x 的值,但作为副作用使得指针向前移动,而不是增加所指向的内容。前缀 ++ 和一元运算符 * 具有相同的优先级,因此它们从左到右依次应用;因此 ++(*x)++*x 将得到相同的结果(*x 得到了递增,而不是 x)。


1
谢谢提到括号的重要性.. :) - A.s. Bhullar

6
假设x所指的值为10,即(*x为10)。
y = (*x)++;

上述语句将被执行为:
1. y = *x
2. *x = *x + 1
因此,y = 10 & *x 等于 11

y = ++(*x);

以上语句将被执行为:
1. *x = *x + 1
2. y = *x
因此,y的值为11,*x的值也为11。


2

一个在使用 x 值之前递增存储的值(前缀),而另一个则在使用后递增它(后缀)。

还要注意,++(*x) 不等同于 (*x + 1)。第一个递增值并将其存回,而另一个仅递增该值。


@mikefisher 哦,那样的话没错。 - Some programmer dude

1
一个是“前缀”,另一个是“后缀”。这就是它们的区别。一个在增量之前进行评估(第一种选项),另一个在增量之后进行评估(第二种选项)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接