一个简单的java题,你能做出来吗?
转载一个java题:
public class Test {
public static void main(String[] args) {
int i = 11;
i += i++;
System.out.println(i);
}
}
写出结果,然后上机测试一下,看看和你想的是否一样,说出为什么?
问题点数:50、回复次数:73Top
1 楼jobs002(Oh! Office)回复于 2006-08-01 12:00:07 得分 0
调试一下就出来了Top
2 楼wangxin4450(接近幸福)回复于 2006-08-01 12:01:07 得分 0
i++是先使用变量i,然后自加Top
3 楼helloMoney(你好,金钱)回复于 2006-08-01 12:01:41 得分 0
为什么不是23?Top
4 楼callzf()回复于 2006-08-01 12:07:24 得分 0
先加,然后再自增啊,所有就得到22
如果换成i+=++i; 就是楼上要的结果23了Top
5 楼kevinliuu()回复于 2006-08-01 12:11:38 得分 0
i++
先用后自增Top
6 楼maquan('ma:kju)回复于 2006-08-01 12:19:02 得分 0
看一下分解动作,就比较清楚了:
0. 先把表达式改写为 i = i + (i++)
1. 取 i 的值,参与表达式计算;
2. 计算赋值语句右边的表达式的值;
3. 对 i 进行自增操作;
4. 把 (2) 中计算出的表达式的值赋值给左边。
所以,结果就是 22 啦Top
7 楼jokerjava(冷血)回复于 2006-08-01 12:19:14 得分 0
奇怪 不是23
i++什么时候计算的。。。
什么时候自增的
i += i;
i++; 是23
i是一个变量
不是两个
int i = 11;
int j = 11;
i += j++;
System.out.println(i);
System.out.println(j);
这样22没问题
关键i是一个变量
Top
8 楼jokerjava(冷血)回复于 2006-08-01 12:20:38 得分 0
0. 先把表达式改写为 i = i + (i++)
1. 取 i 的值,参与表达式计算;
i = 11
2. 计算赋值语句右边的表达式的值;
i = 22
3. 对 i 进行自增操作;
i = 23
4. 把 (2) 中计算出的表达式的值赋值给左边。
i = 23
i是一个变量
Top
9 楼jokerjava(冷血)回复于 2006-08-01 12:22:41 得分 0
难道是这样
0. 先把表达式改写为 i = i + (i++)
1. 取 i 的值,参与表达式计算;
i = 11
2. 计算赋值语句右边的表达式的值;
22
3. 对 i 进行自增操作;
i = 12
4. 把 (2) 中计算出的表达式的值赋值给左边。
i = 22
Top
10 楼maquan('ma:kju)回复于 2006-08-01 12:24:35 得分 0
【对不起,上贴有误,根据 javap 的结果,重发一贴】
看一下分解动作,就比较清楚了:
0. 先把表达式改写为 i = i + (i++)
1. 取 i 的值,用于表达式计算;
2. 对 i 进行自增操作;
3. 计算表达式的值(此时用的是 (1) 中取得的值);
4. 把 (3) 中计算出的表达式的值赋值给 i。
所以,结果就是 22 啦
附 javap 的打印结果:
0: bipush 11
2: istore_1
3: iload_1
4: iload_1
5: iinc 1, 1
8: iadd
9: istore_1
10: getstatic
13: iload_1
14: invokevirtual
17: returnTop
11 楼bengzi()回复于 2006-08-01 12:29:53 得分 0
i++,++i是两个不好搞的东西Top
12 楼cbzdream(迷茫)回复于 2006-08-01 12:43:32 得分 0
大家注意,i是一个变量Top
13 楼jlusdy(LOST)回复于 2006-08-01 12:59:11 得分 0
魔幻数字啊
编程时谁会这样写Top
14 楼kestrel(隼)回复于 2006-08-01 13:05:11 得分 0
22。++i:先增加,后引用;i++先引用,后增加。Top
15 楼cbzdream(迷茫)回复于 2006-08-01 13:11:16 得分 0
++i:先增加,后引用;i++先引用,后增加。
这个道理谁都懂Top
16 楼zhunzhunzhun_sky(隼)回复于 2006-08-01 13:15:57 得分 0
22Top
17 楼wanguanghai(心灵鸡汤)回复于 2006-08-01 13:30:50 得分 0
callzf() ( ) 信誉:100
同意Top
18 楼zhuhaibin62zx(binbin)回复于 2006-08-01 13:37:56 得分 0
想错了。 把结果44Top
19 楼DraculaW(成爲牛人,然後離開)回复于 2006-08-01 13:45:49 得分 0
這個java編譯器是怎麽進棧的阿Top
20 楼cbzdream(迷茫)回复于 2006-08-01 14:16:58 得分 0
还没有人说出原理Top
21 楼doer_ljy(可战)回复于 2006-08-01 14:23:00 得分 0
可能是jokerjava(冷血)的第二个解释。
i++的运算结果是存在一块内存里,用于等运算后生效。
但是i += 这个操作再i++之后又产生了一个计算结果给i赋值。
结果22这个计算结果把i++的结果覆盖了。
最后i=22
相当于:
i=11
A=i=11+1=12(i++)
A=11(i++未生效)+11(i++未生效)=22
i=A
所以i等于22
只是猜测Top
22 楼cyj18()回复于 2006-08-01 14:26:49 得分 0
不是的吧 ,这个也会有人做错 ?22Top
23 楼maquan('ma:kju)回复于 2006-08-01 14:28:46 得分 0
> 还没有人说出原理
连 javap 的 disassembled code 都给你了,还要什么“原理”?!Top
24 楼cyj18()回复于 2006-08-01 14:29:48 得分 0
先是i=11 ,然后I = I+I++; 最后输出I I = 11 + 11; 算完22 ,然后 I++ 结果23Top
25 楼cbzdream(迷茫)回复于 2006-08-01 14:34:29 得分 0
to maquan('ma:kju):
javap 的 disassembled code 看不懂Top
26 楼maquan('ma:kju)回复于 2006-08-01 14:42:41 得分 0
【分解动作之分解】
// 0. 先把表达式改写为 i = i + (i++)
// 这件事已经由编译器做完了
0: bipush 11
2: istore_1
3: iload_1 // 1. 取 i 的值(这是右侧表达式的第一个 i)
4: iload_1 // 1. 取 i 的值(这是右侧表达式的第二个 i)
5: iinc 1, 1 // 2. 对 i 进行自增操作;
8: iadd // 3. 计算表达式的值,也就是做个加法(此时用的是 (1) 中取得的值);
9: istore_1 // 4. 把 (3) 中计算出的表达式的值赋值给 i。
10: getstatic
13: iload_1
14: invokevirtual
17: return
Top
27 楼xiezengguang(增广贤文)回复于 2006-08-01 14:44:09 得分 0
好奇怪哟!
居然跟C不一样
看来是编译器的事情吧?Top
28 楼cbzdream(迷茫)回复于 2006-08-01 15:08:05 得分 0
// 3. 计算表达式的值,也就是做个加法(此时用的是 (1) 中取得的值);
关键是为什么还用(1)中取得的值?Top
29 楼maquan('ma:kju)回复于 2006-08-01 15:15:46 得分 0
> 关键是为什么还用(1)中取得的值?
从 disassembled code 看到的就是这个样子的。
至于为什么要做成这个样子,那,只能说是“编译器的选择”。Top
30 楼dogod(那天,正喝着汤,猛然间....睡着了!)回复于 2006-08-01 15:16:22 得分 0
其实可以用
i+=i+++i;
试试,可分解成
i=i+(i++)+i;
寄存器累加结果是:i<=11+11+12
34
Top
31 楼idonoty()回复于 2006-08-01 15:20:28 得分 0
看完这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横网络bbs多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子.楼主,是你让我深深地理解了'人外有人,天外有天'这句话.谢谢侬!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子.但是我还是回复了,因为觉得如果不能在如此精彩的帖子后面留下自己的网名,那我死也不会瞑目的!能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊!楼主,请原谅我的自私!我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好看了!我愿意一辈子的看下去!这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范.大师的话真如"大音希声扫阴翳",犹如"拨开云雾见青天",使我等网民看到了希望,看到了未来!晴天霹雳,醍醐灌顶或许不足以形容大师文章的万一;巫山行云,长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概!就小说艺术的角度而言,这篇帖子不算太成功,但它的实验意义却远远大于成功本身.正所谓:"一马奔腾,射雕引弓,天地都在我心中!
Top
32 楼maquan('ma:kju)回复于 2006-08-01 15:23:31 得分 0
哈哈!idonoty(),你是不是想说,这个问题已经被问过无数遍了?
不过,这次说的是 i += i++,比以前经常问到的 i = i++ 还是多了一点新意的 ;pTop
33 楼yueyue6681(天空)回复于 2006-08-01 15:36:10 得分 0
++放前面跟放后面是有区别的 放前面先+后输出 后面是 先输出后+的Top
34 楼cbzdream(迷茫)回复于 2006-08-01 15:42:28 得分 0
如果没有javap,你怎么分析这个问题?Top
35 楼yueyue6681(天空)回复于 2006-08-01 15:48:21 得分 0
可以写个C语言啊 意思是一样的 就是算发问题Top
36 楼os586(冷菜)回复于 2006-08-01 15:54:41 得分 0
大家都分析的有道理
不过仔细的把几个点掌握了就不会出错了
其实最主要的还是i++
然后运算优等级的问题了Top
37 楼yueyue6681(天空)回复于 2006-08-01 16:05:58 得分 0
其实就是这样简单的理解吧!!
放前面先+后输出 后面是 先输出后+的
Top
38 楼Nowish(看我能忍耐多久)回复于 2006-08-01 16:07:30 得分 0
22对么?Top
39 楼askuaile()回复于 2006-08-01 16:32:16 得分 0
那i什么时候自增呀?i++不是先参与运算后自增吗?Top
40 楼yangyunzhao(周南梦里人)回复于 2006-08-01 16:35:48 得分 0
这样搞很无聊,国人就爱这样。典型的高考题目。
请问茴香豆的茴有几个写法?谢谢
Top
41 楼cbzdream(迷茫)回复于 2006-08-01 16:42:15 得分 0
我觉得到没那么无聊,考的是基础知识,虽然我们肯定不会那样写程序Top
42 楼wakefun(睡不着)回复于 2006-08-01 17:27:24 得分 0
<?php
$i = 11;
$i += $i++;
echo $i;
?>
为啥我在php里面打印出来得23呢Top
43 楼insiku(不问世事好多年~~|| PM我时请附上帖子地址)回复于 2006-08-01 20:07:06 得分 0
jokerjava(冷血) ( )
匪夷所思Top
44 楼yueyue6681(天空)回复于 2006-08-02 20:11:37 得分 0
to:askuaile()
循环他就会自增的!!Top
45 楼bluesky8013(深入学习J2EE,为找工作打基础!)回复于 2006-08-02 20:55:40 得分 0
钻这空子真的是有病,写清楚点多好,死抠这东西,冇味Top
46 楼cbzdream(迷茫)回复于 2006-08-02 21:08:55 得分 0
考的是大家的java基础知识Top
47 楼sixme(子曾经曰过:“基础和算法才素王道”。)回复于 2006-08-02 21:37:33 得分 0
本来应该是23的,后来被自加前的22覆盖了 ···
r=i=22;
i++后=23
i=r=22;
So the result is:22Top
48 楼candy824()回复于 2006-08-02 23:30:44 得分 0
哈哈,这个帖子真有意思!Top
49 楼pastom()回复于 2006-08-02 23:39:05 得分 0
各位大虾,小弟的看法是按照上面的javap的情况来看,编译器一次将i=i+i++中的第2,3个i都入拉桟,那么答案是22就不用解释拉,但是,小弟想说的是这样的编译情况用运算优先级是解释不通的,试想,上述中的运算符优先级是++,+,=,按照这样的顺序,应该是先计算i++,由于其实先引用后加,那么应该变成11+12才对,那么这样分析的答案是23,我实在想不明白为什么优先级的分析是错的,上面的给出22的仁兄你能解释下马,用运算符优先级解释,我个人认为要是一开始的运算不是i++的那就免谈拉,自加的运算优先级最高,应该是最先进行运算的,要是有什么说错拉,请大虾们赐教,谢谢Top
50 楼jypig2000(Reboot)回复于 2006-08-03 00:04:37 得分 0
#include<stdio.h>
void main() {
int i = 11;
i += i++;
printf("%d",i);
}
C语言中是23,即为
i=i+11,i++;
Java中是22,所以不一样~~!!!!!!
具体如何结实,高手给个解释,小弟迷茫Top
51 楼jypig2000(Reboot)回复于 2006-08-03 00:11:38 得分 0
呵呵~~~,仔细看了楼上的明白了,是因为Java会对未命名变量分配地址的缘故
Top
52 楼iqnyrnr()回复于 2006-08-03 01:39:26 得分 0
应该是和运算符优先次序问题
优先次序 运算符
1 . [] ()
2 ++ -- ! ~ instanceof
3 new (type)
4 * / %
5 + -
6 >> >>> <<
7 > < >= <=
8 = = !=
9 &
10 ^
11 |
12 &&
13 ||
14 ?:
15 = += -= *= /= %= ^=
16 &= |= <<= >>= >>>=Top
53 楼hero222(笑傲江湖)回复于 2006-08-03 08:20:04 得分 0
22
no problemTop
54 楼boxerbinit(boxer)回复于 2006-08-03 11:09:47 得分 0
这道题应该放在C语言区Top
55 楼starshining(star)回复于 2006-08-03 13:12:53 得分 0
学习ing 本来看了前几个答案,尤其是maquan('ma:kju)的《分解动作之分解》 以为有一点明白了,谁知道看了后面的,又不大明白了 ^_^
jypig2000(Reboot) 的 c 语言中得到 23 有没有人试验过啊,有人知道原因何在吗?Top
56 楼candy848484()回复于 2006-08-03 13:19:38 得分 0
新东方职业教育中心强烈推出软件测试工程师
项目介绍
随着软件业的迅猛发展,软件产品的质量控制与质量管理正逐渐成为企业生存与发展的核心。为了保证软件在出厂时的“健康状态”,几乎所有的IT企业在软件产品发布前都需要大量的质量控制工作。作为软件质量控制中的重要一环,软件测试工程师应运而生。在大型的软件开发企业中,软件测试工程师基本处于“双高”地位,即地位高、待遇高,同时人才需求缺口超20万人。 然而,国内软件业因对软件质量控制的重要作用认识较晚,尚未形成系统化的软件测试人才需求供应链,造成了目前企业欲招纳软件测试人才却"千金难求"的尴尬局面。
目前,国内已发展起一批专注于软件外包业务的大规模企业,这些企业不但从事软件开发的外包,还承接大量来自顶级企业如IBM、微软的软件测试业务。
新东方职业教育中心经过积极的交流洽谈和调研,帮助国内最大的软件外包企业文思创新技术、博研科技、神州数码等专业公司进行软件测试工程师的培养,以缓解这些企业在人才方面的大量缺口。
培训内容
一、操作系统
1.Windows 操作系统的安装、维护;Windows操作系统的安全管理、用户管理;使用ghost对Windows进行备份和恢复;
2.AIX系统介绍/系统安装;系统管理工具的使用;软件安装与维护;系统的启动与关闭;存储管理;安全管理;任务与进程管理;系统备份与恢复磁带机的使用;
3.Linux系统介绍/系统安装;系统管理工具的使用/软件安装与维护;系统的启动与关闭;存储管理/安全管理/任务与进程管理;系统备份与恢复;
二、程序设计
1.Java编程基础 ,Java Web, J2EE编程;
2.C/C++;
三、数据库知识
1.SQL语言及应用开发技术:DML、DDL、DQL、子查询、多表查询、游标、存储过程、用户定义函数、触发器、数据库设计;
2.SQL Server数据库安装配置:SQL Server的安装、管理;SQL Server数据库备份和恢复;
3.Oracle数据库安装配置:Oracle基础知识;indows/Linux上Oracle数据库的安装;Windows/Linux上Oracle数据库的卸载;用户管理;网络连接;数据库备份与恢复;Oracle中的函数和存储过程;
四、软件工程:Rational Unified Process(RUP);
五、软件测试理论基础
单元测试、集成测试、外部功能测试、回归测试、系统测试、安装测试及验收测试;版本控制方法、源码管理工具VSS/CVS的使用;BUG Tracing、测试计划、测试用例等;测试文档的书写;
六、测试工具
系统学习软件测试的各类工具,包括自动测试工具Quick Test Professional、压力测试工具LoadRunner、测试管理工具Test Director等;
七、IT职业技能素养
职业规划、沟通技巧、团队合作、专业技术规范、面试技巧等职业技能培训;
八、项目实战。
考试/证书
本课程已纳入《全国计算机职业技能考试》(NIT-Pro)标准课程,毕业学员具备通过教育部NIT-Pro考试的能力,并可获得“新东方职业教育标准课程结业证书”。
入学条件
大学专科及以上学历,计算机或理工科专业;具有三级以上英语水平、通过入学测试和面试。
超值优惠的学习费用: 原学费 9900(元) 超值学费:面谈
前途无量的就业前景
软件测试工程师培训后表现合格者推荐深圳华为集团、金山软件(珠海)广东远光软件股份有限公司、深圳市好易通科技有限公司、展盟电子(东莞)有限公司、广州市华工电脑网络工程有限公司等!
郑重的承诺
广州新东方职业教育中心与每位学员签订就业协议;如培训后考核合格,新东方保证负责学员的工作去向,并承诺工资2千以上,否则全额退还培训费。
最终解释权归广州新东方职业教育中心所有
请联系:广州新东方职业教育中心
地址:广州市黄埔大道西413号新东方职业教育中心三楼
咨询电话:020—87515599 020—87501992
相关网址:[url]http://www.oneedu.cn[/url].Top
57 楼forget4ever()回复于 2006-08-03 13:22:59 得分 0
这个结果严重依赖于编译器,不同的处理方式会有不同的结果,所以。。。Top
58 楼starshining(star)回复于 2006-08-03 13:42:16 得分 0
但是 比如我被面试的时候有这道题怎么办啊?总应该有一个理论结果啊.......既然实现依赖于编译器,那有没有达人知道理论上这种情况应该怎么实现啊——是应该用 22 把 i++ 的结果替换掉,还是应该先得到 22 然后 用 i++ 啊??Top
59 楼aa0123()回复于 2006-08-03 21:15:11 得分 0
没想到一个简单的例子引起这么大的讨论,看来真是天外有天Top
60 楼zj0532()回复于 2006-08-03 22:09:56 得分 0
嘿嘿,我对了哈Top
61 楼fishinsky(风)回复于 2006-08-05 09:25:56 得分 0
22绝对是正确答案,
i+=i++等通于i=i+(i++)
按照操作优先顺序,先进行等号右边的运算,从左到右的顺序,i=11,i++的值还是11,此时i=12,但是11+11=22这个值又付给i,所以i的值最后是22,
Top
62 楼tongor(秦唐人)回复于 2006-08-05 09:47:03 得分 0
这个很有意思。Java和C计算结果不样,这个让我更加了解了JAVA.Top
63 楼ilove8(千里|你去哪里了,我等了你很久了!)回复于 2006-08-05 10:15:58 得分 0
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i=11;
i += i++;
Console.WriteLine(i);
Console.ReadLine();
}
}
}
结果是22Top
64 楼jsxww2002()回复于 2006-08-05 10:17:14 得分 0
22 没有问题,在学校老师一直喜欢出这样的问题!Top
65 楼ilove8(千里|你去哪里了,我等了你很久了!)回复于 2006-08-05 10:20:34 得分 0
c# 结果为22耶Top
66 楼shiningsb(web思想社区『www.webtm.cn』)回复于 2006-08-05 10:22:43 得分 0
i = i + i++
i= 11 + 11++(这个表达式完了之后再加)
i = 22Top
67 楼axjlq()回复于 2006-08-05 16:01:58 得分 0
其实这个一点都不是什么基础问题,++放前面是先自增,放后面是后自增,这个才是基础,但是这个问题根本不是考的这个基础,已经有一位兄弟说了php里面出来的结果是23,以后随着java再次修改一些细节升级以后说不定就又会有23的结果了,因为有些东西就看编译器怎么做了,真正在做开发的时候这样的写法肯定会有“不佳实践”之嫌Top
68 楼linofficewhl(黑仔)回复于 2006-08-07 08:16:28 得分 0
分解:
i=i+i++
i=11+11 //因为i++是先用后加,因为程序还不结束,所为还不自加
i=22
System.out.println(I=22);//所以显示i的值为22;
结束后i就自加1
过程就是这样的Top
69 楼microtea(小傅)回复于 2006-08-07 15:30:07 得分 0
i = i + i ++
应该是有一个中间变量temp
1,i + i -->temp=22,
2,i++ --> i=12,
3,i=temp=22Top
70 楼zhmt(孜风)回复于 2006-08-07 15:42:48 得分 0
22很正常啊,有什么讨论的?
奇怪Top
71 楼yayox(飞鸟)回复于 2006-08-07 16:21:11 得分 0
此结果在于编译器的输出顺序,虽然与运算符有关系,但主要问题并不在于运算符的优先级,而在于编译器。c++中就是这样的。Top
72 楼davidafairy()回复于 2006-08-07 19:50:28 得分 0
i += i++;
等于i = i + i++;
自己看等于多少Top
73 楼langke93(冬会初雪)回复于 2006-08-07 20:33:45 得分 0
这是高中的问题好不好?Top




