#include<stdio.h>
int main()
{
int a[2]={10,4};
int *k;
int *j;
j=a;
k=j;
printf("j=%d,k=%d\n\n",*j,*k);
*j++;
++*k;
printf("j=%d,k=%d",*j,*k);
return 0;
}
输出结果为:
j = 10 k = 10 j = 4 k = 11
我认为它应该有相同的结果但事实并非如此。 我想问一下造成这种差异的原因。我没有理由背后的原因。
答案 0 :(得分:4)
您需要挖掘运营商优先级表。
*p++
评估为*(p++)
++*p
评估为++(*p)
第二个是由于前缀++
具有与指针解除引用*
相同的优先级,因此 associativity (这些运算符从右到左)进入播放。
为了完整性&#39;为此,*(p++)
取消引用p
的当前值,并且语句完成后p
将增加1。 ++(*p)
为p
指向的数据添加了1。
答案 1 :(得分:0)
你有两件事情在这里:
前缀和后缀++
之间的不同语义;
前缀和后缀运算符的不同优先级。
后缀运算符的优先级高于一元(前缀)运算符,因此表达式*p++
被解析为*(p++)
- 您将*
运算符应用于{{1}的结果}}。相比之下,前缀p++
运算符和一元++
具有相同的优先级,因此表达式*
被解析为++*p
- 您正在应用++(*p)
运算符为++
的结果。
还要记住,前缀和后缀*p
的行为略有不同。两者都将其操作数增加为副作用,但后缀++
的结果是操作数的当前值,而前缀++
的结果是操作数的值加1。