当前位置:编程学习 > JAVA >>

面试中的一道题

请问int i=0; i=i++;执行这2句话后变量i的值为什么是0的?
不是1吗? --------------------编程问答-------------------- --------------------编程问答-------------------- 求接答啊。。 --------------------编程问答-------------------- i=i++;
是先执行i=i;//此时i = 0
再执行i++;

i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i

--------------------编程问答-------------------- 灰常蛋疼 --------------------编程问答-------------------- java解惑中的经典谜题。

当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符(postfix increment operator)[JLS 15.14.2]:表达式j++的值等于j在执行增量操作之前的初始值。
--------------------编程问答--------------------

我们对比两段程序和它们的汇编代码(javap -c xxx得到): 
   int i=0;     i=i++;                                                 int i=0;         i=++i;     ------------------------------------------------------------------------------------       
0: iconst_0                                                       0: iconst_0    
1: istore_2                                                       1: istore_2    
2: iload_2                                                        2: iinc 2, 1    
3: iinc 2, 1                                                      3: iload_2    
4: istore_2                                                       4: istore_2    
5: return                                                         5: return    
它们区别在于2,3两句。    
从优先级来看  "前++" >" =" > "后++",所以汇编代码清楚地显示了代码执行地过程。    
第二段代码地结果是1,没有问题。    
从汇编代码来看,=赋值地过程是先利用临时变量计算=右边地值,然后在赋给左边地变量。    
这样,我们就很容易解释第一段代码地运行结果了:    
  临时变量先得到i原来地值是0(汇编代码1),这时候考虑优先级,=大于后++,所以临时变量就执行赋值操作,
  之后临时变量先读出i地值(汇编代码2),再进行++操作(汇编代码3),但是++操作只是在临时变量自己身上加一,不会影响原来地i值。    
  按照上面地思路再分析第二段代码,也就顺理成章了:)
--------------------编程问答-------------------- 这也是月经贴了:


http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html --------------------编程问答-------------------- 去看一下i++和++i的区别应该就懂了 --------------------编程问答-------------------- 先赋值,再自增
与引用不相同 --------------------编程问答-------------------- --------------------编程问答--------------------
public class LamarTest {
public static void main(String arg[]){
int i=0,j=0;
j=i++;
System.out.print("i = " + i + "\n" + "j = " + j);
}
}


i = 1
j = 0
--------------------编程问答-------------------- 太简单了,孩子你的C语言基础部行,得好好补补,要不做不了嵌入式,我来给你解析下。
int i=0;初始化i为0,i=i++;首先考了一个赋值运算的方向性,最后当然是自增啦,
首先要求赋值号右边的自增表达式了,i++的值是0,如果是++i则是1,把0赋值给变量i,
结果当然是0了。你是误以为把i++后i的值为1后赋值给变量i。 --------------------编程问答-------------------- --------------------编程问答-------------------- 优先级的问题,=的优先级比++优先级高 --------------------编程问答-------------------- int i=0;
int j=i++;
response.write(i.tostring());

结果 1

response.write(j.tostring());
结果 0 --------------------编程问答-------------------- --------------------编程问答-------------------- 这问题c语言的结果跟java结果不一样的!
按c的方式分析这个问题准错


引用 12 楼 ljclx1748 的回复:
太简单了,孩子你的C语言基础部行,得好好补补,要不做不了嵌入式,我来给你解析下。
int i=0;初始化i为0,i=i++;首先考了一个赋值运算的方向性,最后当然是自增啦,
首先要求赋值号右边的自增表达式了,i++的值是0,如果是++i则是1,把0赋值给变量i,
结果当然是0了。你是误以为把i++后i的值为1后赋值给变量i。
--------------------编程问答-------------------- 来过了了 --------------------编程问答-------------------- 这个是很久远的一个题目了啊,i=i++;是先复制在加所以每次复制的都是1.即使你执行它10000次它还是1 --------------------编程问答-------------------- 是啊,差一点就看错了 --------------------编程问答-------------------- 1.先去的i=0的值作为表达式i++的值,即现在i为0;
2.再i++自增 为1;
3.将第一步得到的0赋值给i,所以i最后的值为0 --------------------编程问答-------------------- 先赋值在自增! --------------------编程问答-------------------- i在++前,就是先用i再进行++ --------------------编程问答-------------------- 哈哈,这个我都懂 --------------------编程问答-------------------- 正解
引用 6 楼 funfenffun 的回复:
Java code
 
 我们对比两段程序和它们的汇编代码(javap -c xxx得到):  
    int i=0;     i=i++;                                                 int i=0;         i=++i;     -----------------------------------------------……
--------------------编程问答-------------------- 其实
int i=0;
i=i++;
i=i++;
.......
不管加多少次,最后i都是0,通过看字节码更容易深层次理解虚拟机的执行过程。 --------------------编程问答-------------------- int i=0;
i=i++;
system.out.println(i);


为什么i没++呢就执行打印操作了呢? --------------------编程问答--------------------
引用 27 楼 happygao521 的回复:
int i=0;
i=i++;
system.out.println(i);


为什么i没++呢就执行打印操作了呢?



明白了!!! --------------------编程问答-------------------- 学习了,LZ就当编译器把这句代码优化了~ --------------------编程问答-------------------- i=i++;
操作分3步:
1取出i的数值
2将i的值加上1
3将第一步得到的值付给i --------------------编程问答-------------------- 路过,菜鸟涨知识了。 --------------------编程问答-------------------- Java是从左向右的运算方式  所以先让i = i;然后i再自增 --------------------编程问答-------------------- Java™ Puzzlers: Traps, Pitfalls, and Corner Cases.chm --------------------编程问答-------------------- 学习一下。。。。 --------------------编程问答-------------------- 有些简单的题,还是简单地说,说的越深入,对初学者无益! --------------------编程问答-------------------- 又不是++i
有什么好疑惑的 --------------------编程问答-------------------- 经典是经典,可惜是2年前的老题目了。 --------------------编程问答-------------------- 小问题值得注意 --------------------编程问答-------------------- 请问int i=0; i=i++;执行这2句话后变量i的值为什么是0的?
不是1吗?
i++是先赋值再自增,故0++先把0赋给i,再自增,如果再输出i,就是1了。 --------------------编程问答-------------------- 事先声明,本人所说的是为了让楼主更好得了解其本质,所以篇幅稍显得多。首先楼主要弄清楚一个概念和一项原则。一个概念就是表达式,表达式是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合(摘自百度)。这个概念中有三点最重要,一是能求得数值,二就是有意义排列方法,第三点就是组合,第二点又跟我后面要说的一项原则有密切联系。其中,楼主还要弄清楚java语句和表达式的关系以及区别,这个楼主可以自己研究,我就不在此长篇大论,只提及一点,有些语句去掉后面代表它语句身份的“;”,就变成了一个表达式,就比如说你问题中的这两个语句中的第二条:“i=i++;”,这里要说的是,声明语句不符合这条规律,也就是两个语句中的第一条。表达式概念中第一点能求得数值,也就是说表达式本身可以作为一个值来使用,就拿第二句来说,显然,如果作为表达式,也就是“i=i++”(注意,此处没有分号),它的值就是i本身,但现在我们的目的就是要知道i到底最后等于多少,这也就用到了第三点重要的地方:组合,由组合你也可以推出,表达式的组合还是表达式(当然前提是要有意义),反过来说,你也可以知道表达式是可以由表达式组合而成的。所以,i=i++也就可以拆分成“i”和“i++”两个表达式以及“=”,同时,第二条重要的地方派上用场了,对应于java中的地方也就是运算符的优先级,“=”(也就是赋值运算符)的优先级低于“++”运算符,也就是“i++”表达式先进行运算,显然,“i++”的值为0,这里你要明白,“i++”的值虽然受i的初始值的影响,但是值最终是由“i”和“++”符号的位置决定的,至于这个表达式的值存储在什么位置,就需要你自己研究了,主要是栈和堆的问题,这里就不多说了。接下来你完全把“i=i++”看成是“i=a”,而a的值就是“i++”的值,也就是0,所以变量i的值最终是0。这里楼主可能会有疑惑,i++不是自增吗,那i的值不就是1吗?是的,i的值确实曾经是1,但是是在i++执行完之后,还没有进行“i=i++”这个表达式的整体求值也就是赋值运算符开始运算之前的时候。这道题依我来看,主要考察的就是表达式、运算符优先级以及++运算符的特性,楼主可以多看看书中这几个方面的内容。 --------------------编程问答-------------------- i=i++;
是先执行i=i;//此时i = 0
再执行i++;

i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i
--------------------编程问答-------------------- 只要明白i++与++i的区别就好,前者先赋值再自增,后者先自增再赋值 --------------------编程问答-------------------- 看的有点蛋疼 --------------------编程问答-------------------- 先i=i,再++ --------------------编程问答-------------------- 你们让我回到了上大学的年代 --------------------编程问答-------------------- 这个涉及寄存器的具体操作:
1.首先i被赋值为0,并保存在它的存储空间;
2.接着的“i=i++;”是将i的值0取出来,把0值放在相应的寄存器,然后将执行i++操作
3.最后将相应寄存器的0值赋给i;
所以最后i的值为0.

当然这个在C++中执行的话具体结果又会不一样,这与其的具体实现操作有关,所以不要复杂地使用++和--操作,不一理解而且可能会有歧义 --------------------编程问答-------------------- 建议这类问题先百度 google一下,这种题面试也问?表示怀疑??? --------------------编程问答--------------------  i++,是先计算再自加1。 --------------------编程问答--------------------
引用 41 楼 maitianshouwangzhe 的回复:
i=i++;
是先执行i=i;//此时i = 0
再执行i++;

i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i

+1 --------------------编程问答-------------------- 作为菜鸟的我,看着都蛋疼~ --------------------编程问答-------------------- int a=0;
int temp=0;
//++i
 int  add(){
   i=i+1;
   temp=i
return temp 

}
//i++
int add(){
 temp=i;
i=i+1;
return temp;


}
//进行I++,++I运算得有三点。
1、运算符的优先级。
2、I++,++I 都返回是一个中间变量的结果。只是这个中间变量赋值的时间不同。
3、I++,++I运算过后,i的值都会加1; --------------------编程问答-------------------- 这道题真的不简单……
C和JAVA 的运行结果是不同的,所以如果只是分析 前++和后++的优先级问题,恐怕还得慎重思考…… --------------------编程问答-------------------- i++相当于一个函数
int j=i;
i++;
return j;

所以i=i++;相当于
int j=i;
i++;
i=j; --------------------编程问答-------------------- C语言的++好像是说整条语句执行完成之后才执行 --------------------编程问答-------------------- 而java中的++相当于一个函数,取完数据之后执行 --------------------编程问答-------------------- 这个例子相当不错 --------------------编程问答-------------------- i++是先用再加  如果是++i是先加在用
所有他在没有循环的条件下当然是初始值! --------------------编程问答-------------------- 在上学的时候就常常搞错这个问题。在java里面,++是一个单独的运算符,java里的计算和咱学的算术是一样的。
对于i=i++是先将i的值赋值给i,再对i进行加1,在加后没有对i赋值,所以i的值是没有变的,先i=i; i+1
对于i=++i是先给i+1,然后将结果赋值给i,即i=i   --------------------编程问答-------------------- 先执行后运算和先运算后执行的区别 --------------------编程问答-------------------- 代码中最好不要这样写 --------------------编程问答-------------------- i=i++;
是先执行i=i;//此时i = 0
再执行i++;

i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i
--------------------编程问答-------------------- 你放到Eclipse里面运行一下, 你会发现结果是0的。
引用 58 楼 gougou8805 的回复:
在上学的时候就常常搞错这个问题。在java里面,++是一个单独的运算符,java里的计算和咱学的算术是一样的。
对于i=i++是先将i的值赋值给i,再对i进行加1,在加后没有对i赋值,所以i的值是没有变的,先i=i; i+1
对于i=++i是先给i+1,然后将结果赋值给i,即i=i
--------------------编程问答-------------------- 哎!这么多人跟进,这简单的题还是面试题,忽悠谁呢?lz估计刚刚接触汇编语言,这样的题看看书就明白了 --------------------编程问答-------------------- 三楼正解 --------------------编程问答-------------------- 学过c语言了吗?
int   i=0;
printf("%d",i++);
你看看输出什么。 --------------------编程问答--------------------
引用 44 楼 tirion_fordring 的回复:
先i=i,再++
简单明了。 --------------------编程问答-------------------- i++是在i值被使用后才+1,换句话没有被使用的话就不会加1,怎么才算使用呢就是进行过运算包括复制但是i=i相当于没有操作所以不会有+1 --------------------编程问答--------------------
引用 67 楼 fskjb01 的回复:
i++是在i值被使用后才+1,换句话没有被使用的话就不会加1,怎么才算使用呢就是进行过运算包括复制但是i=i相当于没有操作所以不会有+1

补充一下:怎么理解好“被”字和“才”字是关键 --------------------编程问答-------------------- 先赋值,后自增,结果为1
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,