黑马程序员技术交流社区
标题:
一道面试题
[打印本页]
作者:
Sasson
时间:
2013-11-6 12:25
标题:
一道面试题
本帖最后由 Sasson 于 2013-11-6 15:20 编辑
class Demo {
public static void main(String[] args) {
int i = 0;
for(int x = 0; x < 10; x++) {
i=i++;
}System.out.println(i);
}
}
老师讲的是i++每次都保存在一个临时变量 没有给=号左边的 i 赋值 所以 i 还是为零
求高手详细的解释·····
作者:
那得好好想想
时间:
2013-11-6 13:06
这个是前++ 和后++的问题。区别在于i++是i先不自加,在语句完后自加,而++i则是先自加;
你代码中,第一次循环时候,当i=0时,传进来一个0,先不自加,那么此时i出去以后还是0,然后循环,进入第二次循环时由于i还是0,所以逻辑与结果与第一次一样,还是0,一直到循环结束,结果都一样,都是0。
如果改成 i=++i;就不一样了, 进来先让i进行自加,循环第一次i就等于1,然后赋值给i,i出去以后是1,然后进入第二次循环,进来是1,再自加,结果就是i=2,依次循环到最后一次,i=10;
作者:
RuntimeError!
时间:
2013-11-6 13:30
这个可以这么理解 用汇编可以怎么表示
pop i
mov CX,i
INC I
mov i CX
push i
意思就是 i值压入堆栈,但是i要自增 所以又被存到CX寄存器 进行自增运算后返回i ( 这里写i 实际应该是i的地址)然后返回后 把堆栈中的i值返回到i地址
相当于 这个过程中 地址i指向的数值由0变1在变0
个人的一点想法。。也请高手指教一下。。
作者:
spiderman
时间:
2013-11-6 13:41
i=i++,i++先执行,此时,i会自增为1,但是i++会返回0——也就是说,当 i 刚变成1时,又被i++返回的0给取代了,所以。。。。一直都是0。。。。。
作者:
零下五度的水
时间:
2013-11-6 13:48
i++ 确实是底层操作,也就是用汇编的那一套,
i = i++ 这个是优先级的问题,
等号的优先级永远是最低的,++的优先级是相当高的,
所以先计算 i++,
i++ = 0;这时候 i=1
然后计算 i = (i++) = 0
所以最后 i 还是等于 0 的
作者:
spiderman
时间:
2013-11-6 13:49
你可以这样理解,i++相当于一个带有返回值的方法,这个方法里面,有一条i=i+1的语句,但是,返回值却是i-1,就像这个例子
class Demo
{
static int i = 0;
public static void main(String[] args)
{
i=demo();
System.out.println(i);
}
public static int demo()
{
i=i+1;
return i-1;
}
}
复制代码
如果这个代码看不懂就不要想它了,越想越迷糊
作者:
RuntimeError!
时间:
2013-11-6 14:07
其实就这么想就好了 i++是把i先压栈 就是备份一下 然后自增 最后把栈中的i拿出来用。。 i++相当于2个动作 备份 自增 而++i就一个动作 就是自增 而且 这里的自增运算级最高
作者:
Sasson
时间:
2013-11-6 15:16
嗯嗯 谢谢各位了
作者:
陈宏山
时间:
2013-11-6 16:21
class Demo {
public static void main(String[] args) {
int i = 0; //定义 int 类型的变量i=0
for(int x = 0; x < 10; x++) { //当x=0进入循环 // x=1 进入循环,.............
i=i++; //i++ ,先把0赋值给左边变量i,然后i++等于1但是没有赋值给i,循环结束//i++ ,先把0赋值给左边变量i,然后i++等于1但是没有赋值给i,循环结束
}System.out.println(i);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2