123
返回列表 发新帖
楼主: quanzhidao

i=i++ + i--; 怎么算

[复制链接]
论坛徽章:
4758
季节之章:冬
日期:2019-07-13 22:29:26季节之章:春
日期:2019-07-13 22:29:26季节之章:夏
日期:2019-07-13 22:29:26季节之章:秋
日期:2019-07-13 22:29:26嫦娥
日期:2019-08-03 07:05:29玉石琵琶
日期:2019-08-03 08:17:02铁扇公主
日期:2019-08-03 21:12:36九尾狐狸
日期:2019-08-05 21:05:25玉石琵琶
日期:2019-08-06 06:36:05玉兔
日期:2019-08-06 16:05:50
21#
发表于 2009-1-28 08:54 | 只看该作者
学习。

使用道具 举报

回复
论坛徽章:
111
粉钻
日期:2012-01-22 15:43:36绿钻
日期:2012-01-22 15:44:55至尊黑钻
日期:2012-01-22 15:51:10黄钻
日期:2012-01-22 15:57:04ITPUB元老
日期:2016-12-29 11:02:08海蓝宝石
日期:2012-01-22 15:50:08萤石
日期:2012-01-22 15:50:08红孩儿
日期:2011-08-23 10:00:03玉兔
日期:2011-06-19 08:00:05菠菜明灯
日期:2011-05-31 09:51:15
22#
发表于 2009-2-2 16:43 | 只看该作者
为什么不写简单点的i = i + 1呢?
自己折腾自己!

使用道具 举报

回复
论坛徽章:
111
粉钻
日期:2012-01-22 15:43:36绿钻
日期:2012-01-22 15:44:55至尊黑钻
日期:2012-01-22 15:51:10黄钻
日期:2012-01-22 15:57:04ITPUB元老
日期:2016-12-29 11:02:08海蓝宝石
日期:2012-01-22 15:50:08萤石
日期:2012-01-22 15:50:08红孩儿
日期:2011-08-23 10:00:03玉兔
日期:2011-06-19 08:00:05菠菜明灯
日期:2011-05-31 09:51:15
23#
发表于 2009-2-2 16:43 | 只看该作者
原帖由 wangzhonnew 于 2009-1-25 03:20 发表
(taoewang@panipuri) /home/taoewang/test $ more test.c
#include
int main()
{
                int i=5;
                i=i++ + --i;
                printf("%d\n", i);
                return 0;
}
(taoewang@panipuri) /home/taoewang/test $ xlc test.c
(taoewang@panipuri) /home/taoewang/test $ ./a.out
10


still IBM xlc v9.0

.main:                                  # 0x00000000 (H.10.NO_SYMBOL)
        mfspr   r0,LR
        st      r31,-4(SP)
        st      r0,8(SP)
        stu     SP,-80(SP)
        l       r31,T.18.__STATIC(RTOC)
        cal     r4,5(r0)
        st      r4,64(SP)
        cal     r3,-1(r4)
        st      r4,68(SP)
        st      r3,64(SP)
        l       r4,68(SP)
        cax     r3,r3,r4
        st      r3,64(SP)
        cal     r4,1(r3)
        st      r4,64(SP)
        oril    r3,r31,0x0000
        bl      .printf{PR}
        oril    r0,r0,0x0000
        cal     r3,0(r0)
        l       r0,88(SP)
        mtspr   LR,r0
        cal     SP,80(SP)
        l       r31,-4(SP)
        bcr     BO_ALWAYS,CR0_LT
        .long   0x00000000

so it's
itemp=i-1
i=i+itemp
i=i+1


版主是精通java呀!

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2009-2-5 06:03 | 只看该作者
i+++i--

5+i--(now i=6)

5+6 (now i=5)

i=5+6(now i=11)
- and * the same

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2009-2-5 08:00 | 只看该作者
见到高手了

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
26#
发表于 2009-2-7 00:22 | 只看该作者
原帖由 erwinchn 于 2009-1-27 22:53 发表
19楼,你的例子答案应是12,不是11

所以说,光说没有用,要做了才知道自己对不对!
其实说来说去说什么呢?? 程序最基本的东西:优先级问题

使用道具 举报

回复
论坛徽章:
0
27#
发表于 2009-2-7 02:21 | 只看该作者
这题可以结合javap命令和JVM Specification来理解, local variable i 的改变过程是 5 -> 6 -> 5 -> 11 :
0:   iconst_5 后为 5
3:   iinc    1, 1 后为 6
7:   iinc    1, -1 后为 5
11:  istore_1 后为 11

JVM spec:
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#17257

Java Operator Precedence Table:
http://www.cs.uwf.edu/~eelsheik/cop2253/resources/op_precedence.html

$ cat OperatorTest.java
public class OperatorTest {
        public static void main(String[] args) {
                int i = 5;
                i = i++ + i--;
                System.out.println(i);
        }
}

$ javap -c OperatorTest
Compiled from "OperatorTest.java"
public class OperatorTest extends java.lang.Object{
public OperatorTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>")V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_5
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1
   6:   iload_1
   7:   iinc    1, -1
   10:  iadd
   11:  istore_1
   12:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   15:  iload_1
   16:  invokevirtual   #3; //Method java/io/PrintStream.printlnI)V
   19:  return

}

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2009-11-4 19:44 | 只看该作者
非常垃圾的一个问题,千万别这样写!

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
29#
发表于 2009-11-4 23:16 | 只看该作者
原帖由 HOtHat 于 2009-11-4 19:44 发表
非常垃圾的一个问题,千万别这样写!

就是啊

使用道具 举报

回复
论坛徽章:
0
30#
发表于 2009-12-13 12:25 | 只看该作者
也不能说是垃圾问题的嘛...只是考察一下运算的优先级...

然后再说说这个...应该是先算了i++, 再算i--, 然后i++ + i--, 最后i++;
i++ = 5, 但是内存里i已经是6, 所以i-- = 6, 但是内存里又变成了5; 然后6 + 5 = 11赋给了i, 内存里i = 11;
最后i++, 所以i = 12;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表