*p++ 跟 (*p)++ 一样吗

*p++ 和 (*p)++ 一样吗?
*p++ 和 (*p)++ 一样吗?
------解决方案--------------------
不一样,结合顺序问题。
------解决方案--------------------
*p++ == *(p++)
------解决方案--------------------
不一样的。

*p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++;

(*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增,求*p++;


------解决方案--------------------
不一样的,结合顺序不一样。
------解决方案--------------------
3楼+1
他们的相同点是 最后取出的值都是一样,都是*p
不同的是 *p++ 在取值之后 p的指针执行自增,往后移动一个单元
而 (*p++) p没有移动 而是*p的值自增了1
引用:
不一样的。

*p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++;

(*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增,求*p++;

------解决方案--------------------

之前看过一本书,直接把后缀++ --放第一级的。

K&R里面是把后缀++ --放第二级。

仔细想想,第二级里面的运算符都是单目运算符,除了后缀++ --,其他都得搁变量左边。而第二级的结合性都是从右向左,这样的话 ++  -- 自然高出同级别其他运算符了。
------解决方案--------------------

*p++ 是先++ 然后在解引用
(*p)++ 是先解引用,在++

------解决方案--------------------
15楼说的是对的。


void main()
{
int s;
int x[5];
int *p;
for(s=0;s<5;s++)
{
  x[s] = 3*s;

}

p = &x[2];


//printf("%d %d\n",*p++,(*p)++ );
//printf("%d \n",*p++);
printf("%d \n",(*p)++ );
}
printf("%d \n",*p++);
printf("%d \n",(*p)++ );
二者单独打印出来都是6,验证了这个说法的正确性

但是如果使用printf("%d %d\n",*p++,(*p)++ );
大家猜猜结果又是多少


------解决方案--------------------
不一样的。
*p++为*(p++)

------解决方案--------------------
一个是指针运算 一个是数值运算
------解决方案--------------------
不一样的

#include <stdio.h>

void main()
{
int p1[] = {1, 3, 5, 7 ,9};
int *p = p1;

*p++;
printf("*p++ = %d\n", *p);//结果为3 (++优先级比*高)先p++后p指针此时指向p1[1]=3出,再*P取值操作即把3取出

int p2[] = {1, 3, 5, 7 ,9};
p = p2;

(*p)++;
printf("(*p)++ = %d\n", *p);//结果为2 先取值操作此时*p=1 然后再++操作即执行1+1=2 即为最后结果

return;
}
------解决方案--------------------
不一样;
建议你看看那个运算顺序
------解决方案--------------------
这个问题好像没啥疑问吧、咋都盖了20几层楼。。
++*p 和 (*p)++ 等价的。
像*和++等一元运算符是从右至左的结合顺序

------解决方案--------------------
引用:
3楼+1
他们的相同点是 最后取出的值都是一样,都是*p
不同的是 *p++ 在取值之后 p的指针执行自增,往后移动一个单元
而 (*p++) p没有移动 而是*p的值自增了1

引用:

不一样的。

*p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++;

(*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增,求*p++;……

+1
------解决方案--------------------
是这样的。
引用:
不一样的。

*p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++;

(*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增,求*p++;

------解决方案--------------------
*p++ == *(p++)

*与++ 优先级一样,所以是自右向左的算法,

先执行*P,再执行p++即p的地址加1.

(*p)++  先执行*p,然后对p 指向的内容加1、

p++是对地址加1,(*p)++是对指针指向的内容加1


------解决方案--------------------
引用:
不一样,结合顺序问题。
说的对
------解决方案--------------------
虽然结果一样但运算类型不同,一个是指针向后移一位,一个是指针中的数值自加一。
------解决方案--------------------
引用:
不一样的

#include <stdio.h>

void main()
{
int p1[] = {1, 3, 5, 7 ,9};
int *p = p1;

*p++;
printf("*p++ = %d\n", *p);//结果为3 (++优先级比*高)先p++后p指针此时指向p1[1]=3出,再*P取值操作即把3取出

int p2[] = {1, 3, 5, ……

*p++值因为为1;
//*p++
int result = *p++,可以理解为:
int* ptmp = p;
p++;
result = *ptmp;
//*++p
int result = *++p可以理解为:
++p;
*p;
//(*p)++
int result = (*p)++可以理解为:
result = *p;
result++; 

为了便于理解,最好用()来定义优先级,代码会清楚点

------解决方案--------------------
引用:
不一样的。

*p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++;

(*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增,求*p++;
++
------解决方案--------------------
这个就涉及到了所谓的表达示求值问题了,在C++中既可作左值,也可作右值,不知道C++11的标准是怎么样的……

引用:
15楼说的是对的。


void main()
{
int s;
int x[5];
int *p;
for(s=0;s<5;s++)
{
x[s] = 3*s;

}

p = &amp;x[2];


//printf("%d %d\n",*p++,(*p)++ );
//printf("%d \n",*p++);
printf("%d \n",(*p)……