表达式*的p ++和++ * P是如何工作的不同

问题描述:

#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; 
} 

的输出是:表达式*的p ++和++ * P是如何工作的不同

J = 10,K = 10 J = 4,K = 11

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

你有两个东西会在这里:

  • 前缀和后缀++之间的不同语义;

  • 前缀和后缀运算符的不同优先级。

Postfix的运营商有超过一元(前缀)运算符的优先级高,所以表达式*p++被解析为*(p++) - 你申请的*运营商的p++结果。相反,前缀++运算符和一元运算符*具有相同的优先级,因此表达式++*p被解析为++(*p) - 您正将++运算符应用于*p的结果。

还要记住,前缀和后缀++有一些不同的行为。既增加它们的操作数作为副作用,但结果后缀++是操作数的当前值,而前缀++的结果是操作数的值加1

您需要挖掘您的运营商优先级表。

*p++被评价为*(p++)

++*p作为++(*p)

第二个是被评估由于具有相同的优先级指针引用*所以关联(这是由右至左前缀++对于这些运营商)发挥作用。

为了完整起见,*(p++)将当前值p取消引用,并且在语句完成后增加1。 ++(*p)p指向的数据加1。

+0

一元和后缀运算符的关联性是不言而喻的,而且几乎无关紧要。 '*** p'不可能像'(((*)*)*)p'那样从左到右关联,因为这没有意义。同样,'a [i] [j](z)'不能是'a([i]([j]((z))))''。如果你为这些编写了一个Yacc解析器,你不需要'%assoc'声明:这种模糊性根本就不存在。在C中,我们只需要记住一元运算符的优先级低于后缀,所以'op op op expr op op op'表示'op op op(expr op op op)'。 – Kaz