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

i++问题

int i = 0;
i = i++;
System.out.println(i);
请问为什么结果是0,一道很基础的题目,为什么呢?搞不懂?
--------------------编程问答-------------------- 先赋值,后加一。 --------------------编程问答-------------------- i = i++;
相当于int t = i;
i++;
i=t; --------------------编程问答-------------------- 表达式i++的值是0;表达式++i的值是1. --------------------编程问答-------------------- http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html --------------------编程问答-------------------- 可是i自增了啊。变成1,打印出来的应该是1啊。2个i是同一个i对吗?
--------------------编程问答-------------------- 表达式i++的值是0;表达式++i的值是1.  
--------------------编程问答-------------------- int i = 0;
i = i++;//i++是先赋值,再增加 
//如果写成这样
int k=i++;//i的值应该才是1
System.out.println(i);
--------------------编程问答-------------------- 分清i++和++i --------------------编程问答-------------------- 2楼正解,解释得很清楚了 --------------------编程问答--------------------
引用 9 楼 everax 的回复:
2楼正解,解释得很清楚了


+1 --------------------编程问答--------------------
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;


区分 i++ 与 ++i  前者是先使用再自增 后者是先自增再使用 --------------------编程问答--------------------
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;
+1 --------------------编程问答-------------------- 说一下我自己的粗略理解,希望能帮到你。一点一点来。
首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为temp),然后再将这个结果数值(temp)放到左边的接收量中去。
然后再明确第二个问题:自增、自减运算符的先后问题。如果“++”在前面,那就是“先加加,再取加加之后的结果使用”;如果“++”在后面,那就是“先取得尚未加加的原来数值使用,然后这个量再加加”。
这两个问题都非常的基础,一般人都懂,但是理解是否深刻就不一定了,所以就容易出现楼主这样的疑问。
“i”原先的数值是0,然后执行语句“i = i++”,这个语句的作用和“i = i + 1”或者“i += 1”是完全不同的,实现机理不一样,所以结果也不一样。咱们具体来看:
如果是“i = i + 1”,那么首先取得等号右边的结果数值(假设记为temp),也就是0和1的相加之和,将这个结果(也就是1)放到i这个变量中,所以i的内容就变成了1,覆盖了原来的0,这容易理解。
但是对于“i = i++”来说,因为它是“后加加”,所以我们首先取到了i变量尚未加加之前的原来数值0来使用,让这个0作为等号右边的结果数值(即那个临时量temp)。在已经取得了等号右边的结果0之后,再执行后续加加步骤,i的数值就变成了0++ = 1。这时候,我们再继续执行“=”赋值操作,将刚刚取得到的等号右边的结果数值0(那个temp)放到等号左边的变量i当中,那么此时,虽然i已经因为“后加加”操作变成了1,却又因为“=”赋值操作现在重新变成了0。
楼主提问,两个i是否是同一个i?我的回答是,确实是同一个i。这个i变量数值的变化是0 --> 1 --> 0。从0变成1,是因为在取得右侧结果数值之后的加加操作;又从1变成0,是因为再后来的“=”赋值操作。这里要特别注意,“后加加”操作是在“取值”操作之后,但却是在“赋值”操作之前的。
关键不在于理解“=”与“++”的基本意思,而在于明白这个语句的每一个细微的步骤。
我说的比较啰嗦,楼上很多高手应该都是这个意思,我来掰开揉碎而已,欢迎批评指导哦~ --------------------编程问答-------------------- 先做的赋值操作,应该先是i=++i --------------------编程问答-------------------- 这个问题在我刚学的时候也是横迷惑,但是慢慢就明白了。楼上已经解释的横清楚了。记住就行,这是语言定律,没有为什 --------------------编程问答--------------------
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;

我在13楼说的,其实就是这位兄台在2楼所说的内容,他是简单明了版,我是掰开揉碎版,吼吼~ --------------------编程问答-------------------- 谁敢在实际开发中写这样的代码?除非不想干了!

所以,看不懂也无所谓

正常人干不出这种事!
--------------------编程问答-------------------- 2楼正解 --------------------编程问答-------------------- 先把i的值0给i++,然后把i++的值给i --------------------编程问答--------------------
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;

其实学术问题应该严谨些,在vs2010下,相同的c代码我执行结果是1,那其实就是说不同的编译器对表达式求值的顺序不一样,大家讨论下这个顺序问题吧 --------------------编程问答--------------------

      int i=0;
012B351E  mov         dword ptr [i],0  
i=i++;
012B3525  mov         eax,dword ptr [i]  
012B3528  mov         dword ptr [i],eax  
012B352B  mov         ecx,dword ptr [i]  
012B352E  add         ecx,1  
012B3531  mov         dword ptr [i],ecx 



环境vs2010 --------------------编程问答--------------------
引用 9 楼 everax 的回复:
2楼正解,解释得很清楚了


+1 --------------------编程问答-------------------- 小问题有大作用。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 13 楼 coocel 的回复:
说一下我自己的粗略理解,希望能帮到你。一点一点来。
首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为temp),然后再将这个结果数值(temp)放到左边的接收量中去。
然后再明确第二个问题:自增、自减运算符的先后问题。如果“++”在前面,那就是“先加加,再取加加之后的结果使用”;如果“++”在后面,那就是“先取得尚未加加的原来数值使……


就是这样的,你应该分清楚是先自增还是后自增, --------------------编程问答-------------------- 相当可怕的错误,值得注意 --------------------编程问答-------------------- i = i++;
这句话我是这么理解的
首先执行 i = i 也就是i = 0;
然后执行 i+1 但是这时候并没有把结果赋给左操作数(i),所以会打印出 0 --------------------编程问答-------------------- 我给的建议是,要学会自己测试,在你的程序里加几个println语句就可以了,如下所示:
System.out.println(i);

int i = 0;
System.out.println(i);

i = i++;
System.out.println(i);
看每一个输出的结果,当然第一个println如果前面没有定义i的话会报错,后面希望自己调试,我想学会调试程序才是真的学会了东西。


希望对你有帮助 --------------------编程问答--------------------
int i =0;
   i=i++;
   System.out.println(""+i);
i=0
           int i =0;
   i++;
   System.out.println(""+i);
i=1
--------------------编程问答--------------------   其实这跟i++,++i关系不是很大,我分析是这样的
       int i=0;
       i++;       // i=1,i++=0
      i=0 ;    //因为i++=0
 SYso(i)     //为0
   就是赋值的先后 --------------------编程问答--------------------
引用 15 楼 thcthc2 的回复:
这个问题在我刚学的时候也是横迷惑,但是慢慢就明白了。楼上已经解释的横清楚了。记住就行,这是语言定律,没有为什



0---1-----0
i=i++     先赋值 定义一个中间变量 int t=i  此时i是0 赋值t t=0  然后i++ i++之后i=1 可惜啊最后把t这个中间变量的值i=t   t是0嘛,结果i由1又变成了0  很衰啊,悲催的i++啊
--------------------编程问答-------------------- 楼主应先分清后加加 和前加加的区别 i=0,  t=i++这是先给t赋值; i 在加自增 1;运算后结果 t=0,i=1;
i=0,t=++i; 是i 先自增 1 在赋值给t  运算后的结果是 i=1;t=1;
--------------------编程问答-------------------- i++为先赋值在执行
而++i为先执行加1再赋值
--------------------编程问答-------------------- 完蛋玩意。 --------------------编程问答-------------------- i=i++;   的执行过程是这样的,右边先执行,右边的运算结果为0,接着i自加,i=0+1=1,接着,右边的运算结果0再赋值给i,故i=0

--------------------编程问答--------------------
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;


+1 --------------------编程问答-------------------- 表达式i++的值是0;表达式++i的值是1.   --------------------编程问答--------------------
你可以比较下
int a=0,b=0;
a = a++;
b = ++ b
一个是先赋值再自增;
一个是先自增再赋值。
--------------------编程问答-------------------- 很值得学习的问题!! --------------------编程问答-------------------- --------------------编程问答-------------------- i++是先用后加,
++i是先加后用。
很简单的嘛。。。
飘过 --------------------编程问答-------------------- 两种都试着在程序上运行一下就应该清楚吧 --------------------编程问答--------------------
引用 13 楼 coocel 的回复:
说一下我自己的粗略理解,希望能帮到你。一点一点来。
首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为temp),然后再将这个结果数值(temp)放到左边的接收量中去。
然后再明确第二个问题:自增、自减运算符的先后问题。如果“++”在前面,那就是“先加加,再取加加之后的结果使用”;如果“++”在后面,那就是“先取得尚未加加的原来数值……


这个给力 --------------------编程问答-------------------- i++中涉及到两个值,一个是i的值,一个是表达式的值,++i同理 --------------------编程问答-------------------- i++,会使i值+1,但i=又使i赋值回原来的0,这中间有一个临时变量t依然为0. --------------------编程问答-------------------- --------------------编程问答--------------------
你可以比较下
int a=0,b=0;
a = a++;
b = ++ b
一个是先赋值再自增;
一个是先自增再赋值。
--------------------编程问答-------------------- int a=0;
a=a++;
System.out.println(a++);
输出结果:1 --------------------编程问答-------------------- i++的意思是先赋值后加一,++i是先加一后赋值 --------------------编程问答-------------------- --------------------编程问答-------------------- 先算i++的值为0;++i是为1. --------------------编程问答-------------------- 这个问题解释权归oracle(sum)
如果结果是0,则是13楼解释的理由,
如果结果是1,则是20楼的理由。

lz楼的表达式按日常使用习惯是不会出现的,所以什么理由都可以解释过去,其实它说你是语法问题也能解释一堆理由! --------------------编程问答-------------------- 应该是1 --------------------编程问答-------------------- i++,本次输出时i本身,下次再+1 --------------------编程问答-------------------- 前自加和后自加的问题(自减也一样),如果是自加符号在前面,那么他就先把变量的值改变了然后再做操作(赋值也好还是输出或者运算),比如 int i=0;int j= ++i;那么他会先把i变量的值改变,也就是i变成了1,然后把改变后的值赋值给j,那么j就是1了,如果是j=i++,那么他会先把i原来的值赋给j,然后再把i变量自加,也就是j=0,i=1!这只是针对赋值操作,其他操作也是一样的!这就是个是先改变值还是先做操作的问题!胡乱瞎诌,不对的地方请指正!
--------------------编程问答-------------------- 遥想当年搞ACM的时候,写过个类似的函数func(xxx, i++),
就一直记得这个问题了。。。。囧。 --------------------编程问答-------------------- 先赋值,后加一。 --------------------编程问答-------------------- 先赋值,后加一啊哈哈
--------------------编程问答-------------------- 你应该研究一下
i = i++

j = i++
这两个运算之后i的值有什么区别

i = i++;  i此时一定是0,英文在i还没改变之前又赋值给自身,所以相当于i = 0
而 j = i++就没有这种影响,在下次调用i时i就自加成1了 --------------------编程问答-------------------- 你应该先研究下:
i = i++;

j = i++;
看看这两个输出之后i有什么不同

第一个在代码执行时i还没自加就赋值给自身了,所以相当于i=0,而第二个在代码执行后i才自加,所以下次调用i时i就自加成1了 --------------------编程问答-------------------- i++;他本身就是先赋值在运算的 --------------------编程问答-------------------- 学了很多年java了这个问题让我很蛋痛,真的不知道该怎么给你解释。 --------------------编程问答-------------------- 这个问题在java解惑里面写的很清楚 
流程是
temp=i i=i+1 i=temp
但是注意了 在C++下(vc6.0)输出的是1没错 

还有 这道题目根本不基础 不同语言会有不同输出 不要给一个变量在一个式子中赋值2次 完全没有必要而且会出意料之外的错误 --------------------编程问答-------------------- i++:先赋值,再加一
++i:先加一,再赋值 --------------------编程问答-------------------- i++先赋值,再加;而++i 相反 --------------------编程问答-------------------- i=i++;
取出i
让i加1
再把刚才取到的值赋给i --------------------编程问答-------------------- 同意.
引用 1 楼 preferme 的回复:
先赋值,后加一。
--------------------编程问答-------------------- 同意2L的.
引用 2 楼 wjl_mgqs 的回复:
i = i++;
相当于int t = i;
i++;
i=t;
--------------------编程问答-------------------- 可以试一下s = i++ + i++ + i++ ; 的结果,可能会让你有更深的感悟!! --------------------编程问答--------------------
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,