两种表达方式有区别吗:
(*x)++
和
++(*x)
我可以看到这两个语句都替换了 *x 中 (*x+1) 的内容。但是它们之间有什么区别吗?
(*x)++
评估为*x
; 作为副作用,in 的值*x
将增加 1。
++(*x)
计算为*x
+ 1 的值;作为副作用,in 的值*x
将增加 1。
假设代码:
int a = 5;
int *x = &a;
(*x)++
将评估为5
,而++(*x)
将评估为 6。
请注意,不必在计算表达式后立即应用副作用;它只需要在下一个序列点之前应用。
另请注意,括号对;很重要 (*x)++
postfix++
的优先级高于 unary *
,因此*x++
将被解析为*(x++)
; 它仍然计算 的值*x
,但作为副作用推进指针,而不是增加被指向的东西。前缀++
和一元*
具有相同的优先级,因此它们从左到右应用;因此++(*x)
并且++*x
会产生相同的结果(*x
增加,而不是x
)。
假设 x 指向的值是 10 i:e (*x is 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
x
一个在使用之前递增存储的值(pre),而另一个在使用后递增(post)。
另请注意,++(*x)
与. 第一个增加值并将其存储回来,另一个只是增加值。(*x + 1)
一个是“前”,一个是“后”。这就是区别。一个在增量之前评估(第一个选项),另一个在增量之后评估(第二个选项)。