表达式*的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;
}
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。
一元和后缀运算符的关联性是不言而喻的,而且几乎无关紧要。 '*** 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