CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

英雄诗会,举酒论*P++

楼主ngucc(嘎嘎)2005-06-03 19:04:21 在 C/C++ / C语言 提问

各路豪杰,大家好!今天请大家欢聚于此,共讨*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

相关问题

  • P
  • &*p
  • [散分——之读诗取分篇]灵感大发,创作小诗一首 :-P
  • 《英雄》
  • 《英雄》
  • Pirm is P!
  • int **p
  • A& operator=(A &p);
  • <p></p>的问题
  • 【英雄无敌】英雄进

关键词

  • 诗
  • lis
  • printf
  • 运行结果
  • main
  • include

得分解答快速导航

  • 帖主:ngucc
  • lbing7
  • CMyMfc
  • hanxingwuqing

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo