英雄诗会,举酒论*P++
各路豪杰,大家好!今天请大家欢聚于此,共讨*P++问题;在下学C不久,遇到一些基础问题不明。
为 区分*P++,*(P++)等,我编了一个简单的程序 在TC上运行
main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d ",*p++); /*1*/
p=a;
printf("%d ",(*p)++); /*2*/
p=a;
printf("%d ",*(p++)); /*3*/
}
运行结果:1 1 2
*(P++)的那个不是很理解,?按运行结果是代表P指向的元素加1;
按我老师的讲解*1,*2是等价的;运行结果也表明是那样;谭浩强编的《C程序设计》(2版)P215页上说*1与*3等价;从*与++同优先级,右结合性看,好象是那样 ,但结果证明不是;那么如何从“*与++同优先级,右结合性”来理解*(P++)与*P++??
既然说是诗会,有兴致的朋友也可来两句诗
花开堪折直须折,莫待无花空折枝 各位多指教;
问题点数:20、回复次数:33Top
1 楼sunman1982(冥王星)回复于 2005-06-03 19:08:36 得分 0
()的优先级别最高Top
2 楼sunman1982(冥王星)回复于 2005-06-03 19:10:43 得分 0
*1,*2是等价的
这句何解?Top
3 楼ngucc(嘎嘎)回复于 2005-06-03 19:15:35 得分 0
*p++<=>(*p)++ 作用一样Top
4 楼lbing7(向青润老大学习!!!)回复于 2005-06-03 19:17:41 得分 10
我改了一下你的代码!
#include <stdio.h>
#include <conio.h>
void lis(int a[],int b);
int main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d \n",*p++); /*1*/
lis(a,4);
p=a;
printf("%d \n",(*p)++); /*2*/
lis(a,4);
p=a;
printf("%d \n",*(p++)); /*3*/
lis(a,4);
getch();
}
void lis(int a[],int b)
{
int i;
for (i = 0; i < b; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
..........下面是结果............
1
1 3 5 7
1
2 3 5 7
2
2 3 5 7
Top
5 楼lbing7(向青润老大学习!!!)回复于 2005-06-03 19:22:07 得分 0
printf("%d \n",*p++);
问题是在,p++后为什么还是在数组的首元素
我不解这个问题!Top
6 楼lbing7(向青润老大学习!!!)回复于 2005-06-03 19:25:28 得分 0
我知道了!
p++虽然已经自增了但是还是以P原来的为表达式的值
所以*P++取的还是第一个元素
哈哈
谢谢楼主
你还有什么不懂的?Top
7 楼CMyMfc(星际人生:=E.F=FlyForEver)回复于 2005-06-03 19:40:31 得分 5
main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d ",*p++); /*1*/
p=a;
printf("%d ",(*p)++); /*2*/ // 这里, 数组a的内容变成了{2, 3, 5, 7}
p=a;
printf("%d ",*(p++)); /*3*/ // 这里打印的是a[0], 所以是2
}Top
8 楼hanxingwuqing(无效参数)回复于 2005-06-03 19:46:20 得分 5
哈哈,老兄,/*1*/和/*3*/的确是等价的,你们老师胡扯蛋,问题是你搞错了顺序,原因解释如下:
printf("%d ",*p++);和 printf("%d ",*(p++));是一样的,其原理是先执行p++,但是由于++在后,所以先执行结果,后自增1,所以打印出来的结果是1,但是运行结果为什么是1 1 2 呢?
这就是第二句的错了, printf("%d ",(*p)++);这一句的效果是,打印出*p的值,然后将*p的值自增1,所以数组此时的值是{2,3,5,7}, 因此 printf("%d ",*(p++));执行第三句的时候,虽然打印出来的也是的值,但是此时a[0]=2,当然结果是1 1 2 了
此程序可以如此改一下
main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d ",*p++); /*1*/
p=a;
printf("%d ",*(p++)); /*3*/
p=a;
printf("%d ",(*p)++); /*2*/
}
此时执行结果将是1 1 1 ,但是由于最后一句 printf("%d ",(*p)++); /*2*/,所以数组已经变成了{2 , 3, 5 ,7}
Top
9 楼hanxingwuqing(无效参数)回复于 2005-06-03 19:47:57 得分 0
晕,被人抢先了
汗ingTop
10 楼erxwu(溪中石)回复于 2005-06-03 20:32:45 得分 0
#include <stdio.h>
#include <iostream.h>
void main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d ",*p++); /*1*/
p=a;
printf("%d ",(*p)++);/*1*/
cout<<*p<<' ';//2
p=a;
printf("%d ",*(p++)); /*2*/
cout<<*p<<' ';//3
p=a;
cout<<*(++p);
}Top
11 楼ngucc(嘎嘎)回复于 2005-06-04 09:50:42 得分 0
脑子有点混乱,谢谢热心的朋友,我再整理一下思维
haixinghuxing说的程序运行的的确是1 1 1Top
12 楼foochow(无聊,灌水......)回复于 2005-06-04 10:49:23 得分 0
*P++;后缀++的优先级要比*高,所以先p++后*;和*(p++)是一样的
*++p;前缀++的优先级别和*一样高,因为是右到左结合,所以先++后*;Top
13 楼rosegun38(浪子无泪)回复于 2005-06-04 11:03:17 得分 0
大家不要乱讲啊,优先级都查过了吗/Top
14 楼useresu(俗人)(灌水是我无言的抗议)回复于 2005-06-04 11:04:10 得分 0
补充一点:
一个printf中最好不要使用多个*p++,
如果一个printf中不只一个输出,
会导致结果跟编译器实现有关,Top
15 楼useresu(俗人)(灌水是我无言的抗议)回复于 2005-06-04 11:10:28 得分 0
*P++;后缀++的优先级要比*高,所以先p++后*;和*(p++)是一样的
////////////////////
此处温柔讲的不对,
++确实比*的优先级高,
但是*P++和 *(P++)的结果是不一样的.
因为后置++是用++前的结果做为表达式的值的.
就是说*P++会先把p的值作为*运算符的表达式,然后再++,
这跟运算符的优先级并不冲突Top
16 楼foochow(无聊,灌水......)回复于 2005-06-04 11:28:55 得分 0
哦,对了,*p++和*(p++)不一样,前面地址先++然后*,如果加括号就变了,嘿嘿-_-Top
17 楼foochow(无聊,灌水......)回复于 2005-06-04 11:39:41 得分 0
俗人,不对啊,我试了下
int a[]={1,3,3,4,5};
int*p=a;
int b
b=*(p++);和b=*p++;结构是一样的,因为是后缀,都是先将*p的值赋b,再将指针加1Top
18 楼whatsouta(某疯子)回复于 2005-06-04 11:53:18 得分 0
++确实比*的优先级高,
但是*P++和 *(P++)的结果是不一样的.
因为后置++是用++前的结果做为表达式的值的.
就是说*P++会先把p的值作为*运算符的表达式,然后再++,
这跟运算符的优先级并不冲突
这个说法是关键Top
19 楼sztony(最爱美眉)回复于 2005-06-04 11:57:38 得分 0
C语言就是这样太讨厌,干嘛不这样写呢?
...
printf("%d",*p);
p++;
....
这还有歧义吗?
Top
20 楼foochow(无聊,灌水......)回复于 2005-06-04 12:02:56 得分 0
上面写错了是结果..
char*str="whoa";
char ch=*str++; *(str++);结果都一样,先赋值给ch,然后指针++;ch为w;
char*str="whoa";
char ch=*++str;优先级一样,因为是前缀和右到左结合,所有str先++,然后*,ch为h;
楼主的最后一个和第一个输出不一样,是因为你的第二个输出那里改变了数组第一个元素的值...
现在清楚了,刚才搞晕了-_-
Top
21 楼hj5182001(天行健)回复于 2005-06-04 12:13:16 得分 0
++是先赋值后加
main()
{int a[]={1,3,5,7};
int *p;
p=a;
printf("%d ",*p++); /*p++是先赋值后加*/
p=a;
printf("%d ",(*p)++); /*(*p)++也是先赋值后加*/
p=a;
printf("%d ",*(p++)); /*同理*/
}Top
22 楼zhangyu21101213(羽)回复于 2005-06-04 12:48:18 得分 0
就是++和*是同优先级但结合性是从又到左的
楼主的程序的结果没错
潭浩强的书上已经说清楚了
Top
23 楼tuxw(醉书生)回复于 2005-06-04 13:25:58 得分 0
你每次打印之前都 p=a
它不指向首元素那才叫怪Top
24 楼hanxingwuqing(无效参数)回复于 2005-06-04 15:38:58 得分 0
哈哈,问题十分明了嘛
*p++ 和 *(p++) 执行的时候一样的
但是运行后的效果不一样,*p++ 是地址加1,也就是指 *p 此时指向a[1],*(p++) 运算后 *p 依然指向a[0],但是此时a[0]的值已经是 2 了。
我就这么理解了~~~~~~
-----------------------
蹭分就是硬道理!!!!!!Top
25 楼gogdo(草草)回复于 2005-06-04 19:28:02 得分 0
谭浩强编的《C程序设计》(2版)
的书后面不是有张附表吗?上面不是说()在*的上面吗??!
也就是说()的优先级比*高吗!!!!!Top
26 楼gogdo(草草)回复于 2005-06-04 19:30:33 得分 0
还有一点没说,在你的程序里p不是已经自增了吗?怎么结果还是 1,1,2?????Top
27 楼hufengqiang(13号)回复于 2005-06-04 19:46:24 得分 0
一句话:*p++是*P的内容加1;*(P++)是P指向下一个地址,再取内容!Top
28 楼ngucc(嘎嘎)回复于 2005-06-04 22:24:33 得分 0
我来总结一下吧
谭书上说*与++同优先级,右结合性
*p++的值是*P指向内容,然后指针变量P+1,注意这个1,不是数值1,看是什么类型的,开辟相应单元;这由机器完成;
(*p)++值为*P,表示P指向的内容加1,P不自加;
将ibing朋友的代码/*1*/与/*3*/行对换,输出结果一样;Top
29 楼yuanarea(Sail before)回复于 2005-06-04 23:00:30 得分 0
c就是麻烦,学习,UPTop
30 楼yangwuhan()回复于 2005-06-05 00:34:14 得分 0
*p++ 是得到*p的值,然后p增1
(*p)++ 是得到*p的值,然后p所指向的变量增1
*(p++) 是得到*p的值,然后p增1Top
31 楼liubingqian(海风)回复于 2005-06-05 10:04:41 得分 0
楼上正确Top
32 楼ngucc(嘎嘎)回复于 2005-06-05 18:31:39 得分 0
ok.
这次讨论到此结束。感谢大家的热情参与。通过这次活动,解决了我心中不少的疑问,更重要的是,了解了一种分析问题,解决问题的方法。所谓的诗会,虽然没看到多少名家名句,程序员对人与机器的沟通所做的一切,他们笔下千千万万行代码,不正是最美的诗行吗?Top
33 楼sunman1982(冥王星)回复于 2005-06-05 18:57:17 得分 0
楼主是班长或者什么领导么?官腔很重Top




