i++问题 int i = 0;i = i++;System.out.println(i);请问为什么结果是0,一道很基础的题目,为什么呢?搞不懂? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 i = i++;相当于int t = i;i++;i=t; http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html 可是i自增了啊。变成1,打印出来的应该是1啊。2个i是同一个i对吗? int i = 0;i = i++;//i++是先赋值,再增加 //如果写成这样int k=i++;//i的值应该才是1System.out.println(i); 说一下我自己的粗略理解,希望能帮到你。一点一点来。首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为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的值0给i++,然后把i++的值给i 其实学术问题应该严谨些,在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 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 就是赋值的先后 0---1-----0i=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++; 的执行过程是这样的,右边先执行,右边的运算结果为0,接着i自加,i=0+1=1,接着,右边的运算结果0再赋值给i,故i=0 你可以比较下int a=0,b=0;a = a++;b = ++ b一个是先赋值再自增;一个是先自增再赋值。 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 这个问题解释权归oracle(sum)如果结果是0,则是13楼解释的理由,如果结果是1,则是20楼的理由。lz楼的表达式按日常使用习惯是不会出现的,所以什么理由都可以解释过去,其实它说你是语法问题也能解释一堆理由! 前自加和后自加的问题(自减也一样),如果是自加符号在前面,那么他就先把变量的值改变了然后再做操作(赋值也好还是输出或者运算),比如 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了 学了很多年java了这个问题让我很蛋痛,真的不知道该怎么给你解释。 这个问题在java解惑里面写的很清楚 流程是temp=i i=i+1 i=temp但是注意了 在C++下(vc6.0)输出的是1没错 还有 这道题目根本不基础 不同语言会有不同输出 不要给一个变量在一个式子中赋值2次 完全没有必要而且会出意料之外的错误 i=i++;取出i让i加1再把刚才取到的值赋给i 可以试一下s = i++ + i++ + i++ ; 的结果,可能会让你有更深的感悟!! 收藏 java新手,关于this的用法不是太懂,? 如何用struts2来写个文件下载 jbuilder2006对web.xml配置问题 从文本区读数据的问题!与课程设计有关,在线等! 求素数 搞脑子的笔试题,想挑战的来吧(2) study_body(珍惜每一天) 请来帮忙! 类强制转换问题 想成为java高手必须读jdk源代码吗? JAVA的前途????? java比较英语单词 FileReader("")中的相对路径要怎么写啊
相当于int t = i;
i++;
i=t;
i = i++;//i++是先赋值,再增加
//如果写成这样
int k=i++;//i的值应该才是1
System.out.println(i);
首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为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,是因为再后来的“=”赋值操作。这里要特别注意,“后加加”操作是在“取值”操作之后,但却是在“赋值”操作之前的。
关键不在于理解“=”与“++”的基本意思,而在于明白这个语句的每一个细微的步骤。
我说的比较啰嗦,楼上很多高手应该都是这个意思,我来掰开揉碎而已,欢迎批评指导哦~
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
这句话我是这么理解的
首先执行 i = i 也就是i = 0;
然后执行 i+1 但是这时候并没有把结果赋给左操作数(i),所以会打印出 0
System.out.println(i);int i = 0;
System.out.println(i);i = i++;
System.out.println(i);
看每一个输出的结果,当然第一个println如果前面没有定义i的话会报错,后面希望自己调试,我想学会调试程序才是真的学会了东西。
希望对你有帮助
i=i++;
System.out.println(""+i);
i=0
int i =0;
i++;
System.out.println(""+i);
i=1
int i=0;
i++; // i=1,i++=0
i=0 ; //因为i++=0
SYso(i) //为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; 是i 先自增 1 在赋值给t 运算后的结果是 i=1;t=1;
你可以比较下
int a=0,b=0;
a = a++;
b = ++ b
一个是先赋值再自增;
一个是先自增再赋值。
你可以比较下
int a=0,b=0;
a = a++;
b = ++ b
一个是先赋值再自增;
一个是先自增再赋值。
a=a++;
System.out.println(a++);
输出结果:1
如果结果是0,则是13楼解释的理由,
如果结果是1,则是20楼的理由。lz楼的表达式按日常使用习惯是不会出现的,所以什么理由都可以解释过去,其实它说你是语法问题也能解释一堆理由!
就一直记得这个问题了。囧。
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了
流程是
temp=i i=i+1 i=temp
但是注意了 在C++下(vc6.0)输出的是1没错 还有 这道题目根本不基础 不同语言会有不同输出 不要给一个变量在一个式子中赋值2次 完全没有必要而且会出意料之外的错误
取出i
让i加1
再把刚才取到的值赋给i