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

运算符优先级问题:(i++)+(i++)

楼主China_Diablo(暗黑破坏神)2004-12-02 16:54:57 在 C/C++ / C语言 提问

#   include   <stdio.h>  
  #include   <math.h>  
  main(){  
  int   i=3;  
  int   y=0;  
  int   z=0;  
  y=(i++)+(i++);  
  printf("y=%d\n",y);  
  i=3;  
  z=(i++)+(++i);  
  printf("z=%d\n",z);  
  }  
   
  VC6.0的编译结果  
  y=6  
  z=8  
  __________________________________________________  
  那个高人给分析分析 问题点数:100、回复次数:23Top

1 楼yjh1982(血精灵)回复于 2004-12-02 16:59:32 得分 0

没有解释,不同编译器不同实现,不必研究这个Top

2 楼ingot(九儿)回复于 2004-12-02 17:00:36 得分 0

i++   是先执行   y   =   i   +   i;这句,再执行i   +=   1  
  ++i   是先执行i   +=   1   ,在执行   z   =   i   +   i;Top

3 楼carylin(林石)回复于 2004-12-02 17:03:32 得分 10

新的c標準規定,一個錶達式中,若有前加式(如:++i),那么整個錶達式隻做一次自加,並返囬自加后的值。若沒有前加式而隻有后加式(如:i++),那么整個錶達式隻做一次自加,返囬自加前的值。Top

4 楼pacman2000(pacman)(影子传说)回复于 2004-12-02 17:05:53 得分 0

不用看这样的题目,不同编译器结果不同。Top

5 楼carylin(林石)回复于 2004-12-02 17:10:48 得分 10

說錯暸:  
   
  新的c標準規定,一個錶達式中,若有多個前加式(如:++i),那么整個錶達式做多次自加,並以最后一次自加后的值參與運算。若沒有前加式而隻有后加式(如:i++),那么整個錶達式做多次自加,整個錶達式隻以原值參與遠算。Top

6 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-12-02 17:13:15 得分 0

许多编译器都或多或少的跟不上标准:)Top

7 楼muzhi(木子)回复于 2004-12-02 17:20:56 得分 0

如果就c++而言这是因为标准所定向前面诸君说的  
  可是在别的语言中会有不同的结果Top

8 楼kobefly(科比--网络学习中)回复于 2004-12-02 17:21:05 得分 0

carylin(别信我,我在说谎)    
  又见到你了啊  
  哈哈  
   
  严重支持你的发言Top

9 楼steedhorse(晨星)回复于 2004-12-02 17:31:35 得分 0

上帝啊,别让你的子民讨论这个问题啦。。。。Top

10 楼wwxsoft(婉儿)回复于 2004-12-02 17:31:50 得分 10

devc++编译得结果也是   6,8  
  i++   是先执行   y   =   i   +   i;这句,再执行i   +=   1  
  ++i   是先执行i   +=   1   ,在执行   z   =   i   +   i;  
   
  Top

11 楼tsingien(Read The F**king Source Code)回复于 2004-12-02 17:34:54 得分 10

谭老师的学生吗?Top

12 楼LBN1012(星空)回复于 2004-12-02 17:36:52 得分 10

y=(i++)+(i++);  
  z=(i++)+(++i);  
  我用TC++3.0编译了(这个编译器应该不是新标准),结果和你的一样。  
  我是这样认为的,可能编译器在编译表达式的时候是从右到左编译的,第一句由于是i++,先使用了i再执行自加,所以和左右没关系。但第二句先执行后面括号里面的++i,所以z的值是两个4相加,然后i还有自加1,i最后的值是5。  
  (仅仅是我个人的看法,希望有高手出来解释一下)  
  Top

13 楼bobob(静思)回复于 2004-12-02 17:46:11 得分 10

这个放在哪个环境底下的结果都一样,没有歧异(除非不支持标准)  
   
  spec规定i++就是在i参加完了运算再加1  
   
  最后i的值是5Top

14 楼sunshangjun(守望永久)回复于 2004-12-02 19:35:31 得分 10

记住一句话,变量在某一瞬间只保存一个值!!你就能明白了,Top

15 楼uow30(TheU)回复于 2004-12-02 20:39:00 得分 10

这个不同的编译器所得的结果可能不同的,因为对同一个式子有的是从左到右编译,有的是从右到左编译Top

16 楼hewittlee(只爱C++)回复于 2004-12-02 21:13:07 得分 0

要看编译器!Top

17 楼hj5182001(天行健)回复于 2004-12-03 00:04:20 得分 10

我在gcc里编译成汇编代码后  
  >gcc   -O2   S   原文件名.c  
  .file "r.c"  
  .section .rodata.str1.1,"aMS",@progbits,1  
  .LC0:  
  .string "y=%d\n"  
  .LC1:  
  .string "z=%d\n"  
  .text  
  .p2align   2,,3  
  .globl   main  
  .type main,@function  
  main:  
  pushl %ebp  
  movl %esp,   %ebp  
  subl $8,   %esp  
  andl $-16,   %esp  
  subl $8,   %esp  
  pushl $6//------------------------->看见没有在编译器里6已经生成了  
  pushl $.LC0  
  call printf  
  popl %eax  
  popl %edx  
  pushl $8//------------------------->看见没有在编译器里8已经生成了  
  pushl $.LC1  
  call printf  
  leave  
  ret  
  .Lfe1:  
  .size main,.Lfe1-main  
  .ident "GCC:   (GNU)   3.2.2   20030222   (Red   Hat   Linux   3.2.2-5)"  
  Top

18 楼Eagle_118(语夜)回复于 2004-12-03 01:35:07 得分 0

不同编译起有不同的实现。  
  重要是先计算谁的问题。  
  Top

19 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2004-12-03 01:39:29 得分 0

我用vc6.0试过,是6,8。但是可能对于不同的编译器而言,这个结果不同,因为在不同的编译器中,执行的方向不同,可能是从左到右,也可能是从右向左,不过一般情况下在上面的表达式的运算中,绝大部分都是从右向左的。  
  上面的两条表达式中,第一条是两个没有加1前的i相加,所以为6  
  第二个表达式是由于++i,先进行了自加,所以变成了4+4=8。Top

20 楼nirvana_li(东成西就,芝兰境界)回复于 2004-12-03 08:58:37 得分 10

连续的自增自减运算的结果是依赖于具体的编译器的。比如你在TC下编译的结果拿到DEV_C++下面,可能结果就是不一样的。所以为了使我们的程序能够在多个编译器上面能够编译成相同的结果,我们通常避免使用连续自增自减运算的形式。而是用更明确的表达式语句的方法来表示。  
   
  这些属于语言的一些细节,不用太过于追究。Top

21 楼liujingfu123(Oh_My_GoD)回复于 2004-12-03 09:31:21 得分 0

#   include   <stdio.h>  
  #include   <math.h>  
  main(){  
  int   i=3;  
  int   y=0;  
  int   z=0;  
  y=(i++)+(i++);  
  printf("y=%d\n",y);  
  i=3;  
  z=(i++)+(++i);  
  printf("z=%d\n",z);  
  }  
   
  VC6.0的编译结果  
  y=6  
  z=8  
  =====================================================================================  
  y=(i++)+(i++);      
   
  //表达式从右向左扫描,++都是后   +,即先操作再自加,则先把i=3相加即   3+3   赋值给y,所以   y=6  
   
  i=3;  
  z=(i++)+(++i);      
   
  //表达式从右向左扫描,后一个++是前   +,则i先自加变成   4   ,前一个++是后   +,所以   z=4+4=8咯    
   
  但两个   printf()语句之后   i   的值都是   5   了!  
   
  你大概是初学的,老师喜欢弄些这样的东西让你们来玩是吧?但这样的东西没什么用的,在不同的编译器里结果就不同,所以你在写程序的时候也最好不要去用它就OK了!  
  Top

22 楼China_Diablo(暗黑破坏神)回复于 2004-12-03 12:33:11 得分 0

明白了,谢谢各位老师  
  Top

23 楼China_Diablo(暗黑破坏神)回复于 2004-12-03 12:40:08 得分 0

分不够,没加分的同志只能对你你们进行口头感谢了  
   
  +_+Top

相关问题

  • < && || == != 这几个运算符的优先级怎么排的
  • 超简单问题,运算符的优先级比较!
  • 大家好,帮帮忙,运算符优先级问题,谢谢!!
  • 关于运算符优先级的问题
  • 运算符优先级问题,高手请进
  • 一道简单的运算符优先级问题
  • 问题十,取反运算符与左移和右移运算符的优先级问题。
  • 运算符?
  • 位运算符?
  • 运算符?

关键词

  • c++
  • 编译器
  • 编译
  • 执行
  • vc
  • 個錶達
  • 表达式
  • 运算
  • 结果
  • 不同

得分解答快速导航

  • 帖主:China_Diablo
  • carylin
  • carylin
  • wwxsoft
  • tsingien
  • LBN1012
  • bobob
  • sunshangjun
  • uow30
  • hj5182001
  • nirvana_li

相关链接

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

广告也精彩

反馈

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