楼主: quanzhidao

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

[复制链接]
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
11#
发表于 2009-1-25 03:20 | 只看该作者
(taoewang@panipuri) /home/taoewang/test $ more test.c
#include <stdio.h>
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

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
12#
发表于 2009-1-25 03:27 | 只看该作者
by using gcc, we have:
(taoewang@panipuri) /home/taoewang/test $ more test.c
#include <stdio.h>
int main()
{
                int i=5;
                i=i++ + --i;
                printf("%d\n", i);
                return 0;
}
(taoewang@panipuri) /home/taoewang/test $ gcc -S test.c
(taoewang@panipuri) /home/taoewang/test $ ./a.out
9
(taoewang@panipuri) /home/taoewang/test $ gcc -v
Reading specs from /afs/torolab.ibm.com/common/progs/gcc-3.4.3/aix51/usr/local/bin/../lib/gcc-lib/powerpc-ibm-aix5.1.0.0/3.3.4/specs
Configured with: ../gcc-3.3.4/configure --disable-nls
Thread model: aix
gcc version 3.3.4

.main:
        mflr 0
        stw 31,-4(1)
        stw 0,8(1)
        stwu 1,-80(1)
        mr 31,1
        li 0,5
        stw 0,56(31)
        lwz 11,56(31)
        lwz 9,56(31)
        addi 0,9,-1
        mr 9,0
        stw 9,56(31)
        mr 0,11
        add 0,0,9
        addi 11,11,1
        stw 11,56(31)
        stw 0,56(31)
        lwz 3,LC..1(2)
        lwz 4,56(31)
        bl .printf
        nop
        li 0,0
        mr 3,0
        lwz 1,0(1)
        lwz 0,8(1)
        mtlr 0
        lwz 31,-4(1)
        blr

looks like
i=i-1
i=i+i
i++

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
13#
发表于 2009-1-25 03:34 | 只看该作者
for java:
(taoewang@panipuri) /home/taoewang/test $ more test.java
import java.io.*;
class test
{
        public static void main( String args[] )
        {
                int i=5;
                i=i++ + i--;
                System.out.println(i);
        }
}
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/bin/javac test.java
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/jre/bin/java test
11
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/jre/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64devifx-20060310a (SR1))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423ifx-20060310a (JIT enabled)
J9VM - 20060220_05389_BHdSMr
JIT  - 20060220_2133_r8
GC   - 20060214_AA)
JCL  - 20060222a


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

================
(taoewang@panipuri) /home/taoewang/test $ more test.java
import java.io.*;
class test
{
        public static void main( String args[] )
        {
                int i=5;
                i=i++ + --i;
                System.out.println(i);
        }
}
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/bin/javac test.java
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/jre/bin/java test
10
(taoewang@panipuri) /home/taoewang/test $ /home/taoewang/sqllib/java/jdk64/jre/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64devifx-20060310a (SR1))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423ifx-20060310a (JIT enabled)
J9VM - 20060220_05389_BHdSMr
JIT  - 20060220_2133_r8
GC   - 20060214_AA)
JCL  - 20060222a

使用道具 举报

回复
论坛徽章:
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
14#
发表于 2009-1-25 06:46 | 只看该作者
牛年现牛人

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2009-1-25 12:31 | 只看该作者
My test
=======================

C:\J\test\basic>type Oper.java
public class Oper{
        public static void main(String[] args){
                int i=5;
                i=i++ + i--;
                System.out.println(i);
                i=5;
                i=i++ - i--;
                System.out.println(i);
                i=5;
                i=i++ * i--;
                System.out.println(i);
        }
}
C:\J\test\basic>javac Oper.java
C:\J\test\basic>java Oper
11
-1
30
C:\J\test\basic>

My understanding:
=========================
i++ is evaluated as 5
i-- is evaluated as 6(because i++ take into effect)
so the test I did are evaluated as:
5 + 6 = 11
5 - 6 = -1
5 * 6 = 30

so statement i=i++ + i--
=====================
there are 4 operators in this statement:
1) =
2) ++
3) +
4) --
operator precedence is:
2)++
4)--
3)=
1)=

so the statement is evaluated in the following order:
i++: i become 6, but 5 participate in addition action
i--: i become 5 again, but 6 participate in addition action
+: 5 + 6 = 11, but before = is evaluated, i = 5(because of i-- in last step)
=: i = 11 (assign 5 + 6 to i)

使用道具 举报

回复
论坛徽章:
2
开发板块每日发贴之星
日期:2009-01-20 01:01:03紫蛋头
日期:2012-03-14 11:15:43
16#
发表于 2009-1-26 12:27 | 只看该作者

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
17#
发表于 2009-1-27 01:08 | 只看该作者
有没有人能知道怎么把java里面的byte code给翻译出来吗?如果能像看汇编一样看byte code,那这个逻辑不就简单了么

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2009-1-27 06:09 | 只看该作者
Source code:

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


================
from Bytecode viewer:

0 iconst_5
1 istore_1
2 iload_1
3 iinc 1 by 1
6 iload_1
7 iinc 1 by 255
10 iadd
11 istore_1
12 getstatic #2 <java/lang/System.out>
15 iload_1
16 invokevirtual #3 <java/io/PrintStream.println>
19 return

step 2 loads local variable i (=5) pushes 5 on the operand stack,
step 3 changes local variable i from 5 to 6,
step 6 loads local variable i (=6) pushes it on the operand stack,
step 7 changes local variable i from 6 to 5,
step 10 pops add operand and the next 2 stacks(5 and 6) and add them up to 11, pushes 11 back to stack
step 11 pop top stack up and stores it to local variable i (i was changed from 5 to 11)

so i = 11 in the end

使用道具 举报

回复
论坛徽章:
4
19#
发表于 2009-1-27 21:35 | 只看该作者
有啥麻烦得,这东西就看符号在前还是在后
i++就是先使用i得值再把i得值加1,比如
i=i++
那就是先i=i然后再i=i+1,这样得到得
++i就是先i=i+1,然后再i=i

int i=5;
i=i++ + i--;
i++;
说这一个例子吧
i=i(此时i=5)
i=5+(i+1)(此时i=6)
i=5+6=11
然后i--也就是i=10
最后i++得到11
没去写 程序验证,应该是上面这样得过程,符号放在后面就是先使用变量得值,然后再+1(或者-1),符号在后就是先+1(或-1)再使用变量得值

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2009-1-27 22:53 | 只看该作者
19楼,你的例子答案应是12,不是11

使用道具 举报

回复

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

本版积分规则 发表回复

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