本帖最后由 吉吉粥 于 2015-10-21 15:52 编辑
/*
这个代码是逛论坛,看到的帖子自己试着敲了下,但是发现比较多的问题,【有不对的地方希望大神指教】
有点疑问,希望有大神指教下
以下是自己敲得代码,
——————————————————————
*/
package answer;
class answer2
{
public static void main(String[] args)
{
int x=5;
int y=0;
x=x++;//x赋值得到的是5
y=x++;//这个是取了上面的x的结果做运算,结果是也是5(理解)
System.out.println("x="+x+",y="+y);
System.out.println(x);//?输出的到底是【哪个x】
System.out.println(y);
}
}
/*
——————————————————
结果是
x=6,y=5
6(【疑问】按我的理解这里应该也是5,可是结果是6,难道最后输出之前是作了一次加法?)
5
结果x的值跟我预想的不一致,有疑问,【思考】如下
1.单看第二步 y=x++; 取得是第一步x=x++; 中的左边x的值,就是未作加法之前直接赋值,那就是x的初始值,所以y为5。与结果一致ok。
2. 但是最后输出的x的值,得出的值是6,就是意为着x是输出的【做过一次加法】的值。
3. 【疑问】到底是哪一步?
实验
测试第一步代码结果:
——————————————————
*/
package answer;
class answer2
{
public static void main(String[] args)
{
int x=5;
int y=0;
x=x++;//只运行第一步
//y=x++;
System.out.println("x="+x+",y="+y);
System.out.println(x);//无争论的是输出了第一步左边的x的值
System.out.println(y);
}
}
/*
——————————————————————————————
x=5,y=0
5
0
【发现】:结果跟我想的一致,第一步输出结果确实是为5
下来那就是验证,到底是【哪一步】作了加法了,难点就是x的值到底是调用的那个值。
按理解,虽然x赋值到的是5,但毕竟之后x是做过了一次加法的就是6,难道结果是直接输出了做完一次运算的6.
下面就是又写了一些代码
*/
package answer;
class answer2
{
public static void main(String[] args)
{
int x=5;
int y=0;
x=x++;//第1步
//y=x++;
x=x++;//第2步
x=x++;//第3步
x=x++;//第4步
x=x++;//第5步
System.out.println("x="+x+",y="+y);
System.out.println(x);
System.out.println(y);
}
}
/*
结果
x=5,y=0
5
0
【发现】:仅仅第一步,仅仅一个变量,在没有循环的情况下,无论重复多少次,x的值始终是初始值,可理解此条代码对整个程序无意义
然后隐藏第一条代码,仅仅运行第二条代码
——————————————————————————————
*/
package answer;
class answer2
{
public static void main(String[] args)
{
int x=5;
int y=0;
//x=x++;
y=x++;//y取到的是x的初始值5,之后x是做了一次加法的值为6
System.out.println("x="+x+",y="+y);
System.out.println(x);//看结果是输出了作了加法之后的值
System.out.println(y);
}
}
/*
结果
x=6,y=5
6
5
【发现】,对结果有影响的是第二条代码,介入了第三方的变量
那我在加入些变量试下
——————————————————————————————————————————————————————————————
*/
package answer;
class answer2
{
public static void main(String[] args)
{
int x=5;
int y=0;
int z=0;
x=x++;//x=5 加法之前是5 【(无循环)下,始终为5】————————恶循环下 可以忽略不看
y=x++;//y=5 加法之前是5 作了自增加x为6,——————————————————可以看作实际的“第一步”,x加了1
z=x++;//z=6 加法之前是6 作了自增加x为7,这个7是输出了。————可以看作实际的“第二步”,x又加了1,然后输出了
System.out.println("x="+x+",y="+y+",z="+z);
System.out.println(x);//看结果是输出了做了加法的值,从5~7,加了2次。
System.out.println(y);
System.out.println(z);
}
}
/*
结果
x=7,y=5,z=6
7
5
6
【现象】:加入一个y,得到x是6。
又加入一个z,得到的x是7。
【发现】:由此可以推论,就是再多加变量的话x的话也会增加。
那么我就可以认为其实第一步【x+x++;】其实是被下面的其他变量的步骤覆盖掉的,第一步运行完x的值还是5,跟初始值一致【无意义】
真正有意义的是下面其他变量的步骤
【结论】
第一步:是先赋值在做加法的,把x初始值赋值给了x,得到的x是5,x++作了加法之后应该是6,但是没有体现。
第二步:加入了第三方y,接受了x的值,y是5,x的值作了加法是6。
第三步:加入了第四方z,接受了x加法之后的6,z为6,然后做加法为7。
x++先赋值 再做加法,当没有变量介入,在没有循环的情况下是无意义的
一旦加入变量之后,x是在栈内存在做一步一步的加法的
*/ |
|