易码技术论坛

 找回密码
 加入易码
搜索
查看: 111781|回复: 8

谁能解释一下这个

[复制链接]
发表于 2005-11-28 11:00:00 | 显示全部楼层
应该是i=12,t=5吧
 楼主| 发表于 2005-11-28 13:48:00 | 显示全部楼层
按照课本上讲的,应该是12。不过似乎编译器处理的时候把前两个++i当成一个了,就成了

4+4+5=13

??

发表于 2005-11-28 13:56:00 | 显示全部楼层
那你试试(++i)+(++i)看是多少?
 楼主| 发表于 2005-11-28 22:16:00 | 显示全部楼层
得8。

应该是这样的:编译器在接收第一个++i之后,把i自加,得3。然后再接收第二个++i。得4。然后做两个数的+运算。但是此时i已经为4,所以表达式的值为8。



至于java中计算的结果,可能是java的编译器用到了临时变量,把表达式变成了:

x=++i;

t=x+(++i)

发表于 2005-11-29 10:10:00 | 显示全部楼层
还是避免使用有歧义的语句吧。
 楼主| 发表于 2005-12-5 21:28:00 | 显示全部楼层
在c++中:

前缀式:
template<class T> T& operator++();
后缀式:
template<class T> T operator++(int);

第一步 ++i,使i=3,返回i的“引用”
第二步 ++i,使i=4,返回i的“引用”
第三步 i的“引用”+i的“引用”,返回临时变量,值为4+4=8
第四步 ++i,使i=5,返回i的“引用”
第五步 临时变量+i的“引用”,8+5=13
第六步 返回表达式的值13

这里的关键是前置++返回的是“引用”

终于彻底明白了
[em01][em01]
发表于 2005-12-8 13:30:00 | 显示全部楼层
这个问题的答案与编译器密切相关,结果在VC6和VS2005上都不一样。如果你自己写程序,一定不要这样写。
发表于 2005-12-8 14:01:00 | 显示全部楼层
不要在一条语句中对同一变量进行2次以上的自加或自减,因为结果取决于编译器。

6205_23032_2486.rar

15 KB, 下载次数: 397

 楼主| 发表于 2005-11-27 22:56:52 | 显示全部楼层 |阅读模式
int main()

{

    int i,t=2;

    i=(++t)+(++t)+(++t);

    printf("i=%d,t=%d",i,t);

    return 0;

}

FC4下gcc4.0.1和WINXP下VC++6下结果都是

i=13,t=5



而java下的结果是:

/*

* Main.java

*

* Created on 2005年11月27日, 下午9:17

*

*/



package test2;



/**

*

* @author djn

*/

public class Main {

   

    /** Creates a new instance of Main */

    public Main() {

    }

   

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        // TODO code application logic here

        int i,t;

        i=2;

        t=(++i)+(++i)+(++i);

        System.out.println(t);

    }

   

}



i=5,t=12

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 13:57 , Processed in 0.020167 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表