表达式* p ++和++ * p的工作方式不同

时间:2016-11-11 16:12:50

标签: c

#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

我认为它应该有相同的结果但事实并非如此。 我想问一下造成这种差异的原因。我没有理由背后的原因。

2 个答案:

答案 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。