读书人

*p++ 和 (*p)++ 一样吗?解决办法

发布时间: 2012-05-22 18:18:54 作者: rapoo

*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里面是把后缀++ --放第二级。

仔细想想,第二级里面的运算符都是单目运算符,除了后缀++ --,其他都得搁变量左边。而第二级的结合性都是从右向左,这样的话 ++ -- 自然高出同级别其他运算符了。
[解决办法]
C/C++ code
*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++;……

[解决办法]
是这样的。
探讨
不一样的。

*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++ :先对指针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 = &x[2];


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

[解决办法]
不一样
[解决办法]
因为++和*的优先级相同,结合性是自右至左
所以*p++先运算p++再进行;*p运算,因为是后++所以*p是当前值,下一条语句后p指向后一个地址
(*P)++是先运算*p然后再对*p的值进行+1
[解决办法]
不一样,要考虑优先级和结合性
*p++ == *(p++)
[解决办法]
++和*的优先级相同,结合性是自右至左,所以*p++是先结合后边相当于*(p++),而p代表一个地址,所以是p所指向的一个地址先加一,然加上*号,取这个新地址的值。
而(*p)++是指还是原来p对应的老地址中的值加1.希望我的解释对你能有理解。
[解决办法]
肯定不一样啊,*p++先p++,再取值,此时p指向了下一个;
(*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, ……

[解决办法]
一个是指针加,一个是指针指向的内容加

读书人网 >C语言

热点推荐