为啥同样的代码,在C中和在Java中运行的结果是不一样的!

刘裕育 2017-04-03 12:32:19
我一直以为,我已经对java 的基本都已经了解得差不多了,而晚上学弟一个很基本的问题,倒是把我问住了。


这个表达式,是从右向左运行的,当执行到a=a-(a+10)这里时,a 的值应该改变为-10才对,如果a改变成-10,那么整一个表达式的结果应该变成-20,可是只是在c中是这样,在java中,好像a的值一开始就被确定下来了。
后来,我在表达式后面又加上一个表达式,变成


如果安装a的值一开始就被确定下来,这样应该等于-20才对,结果等于-2.
我就不懂了,突然感觉自己的java基本好差。
不搞懂,估计一辈子只能做码农....
求教!
...全文
257 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘裕育 2017-04-03
  • 打赏
  • 举报
回复
引用 1 楼 qq_37499496 的回复:
a=8+(a=8-(8+10)) a=-2
那你能解释一下,为什么第二个表达式,这么算出那样的结果吗?然后相同的表达式,在c为什么算出的结果是不一样的?为什么导致他们的结果不一样?他们各自的机制是什么?
「已注销」 2017-04-03
  • 打赏
  • 举报
回复
a=8+(a=8-(8+10)) a=-2
大隐藏于寺 2017-04-03
  • 打赏
  • 举报
回复
public class Demo {
	
	public static void main(String[] args) {
		int a = 8;
		a = a + (a=a-(a+10));
		System.out.println(a);
	
	}
}
使用javap -c命令反编译,得到下面的结果

public class com.sky.lucene.first.Demo {
  public com.sky.lucene.first.Demo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: bipush        8      //bipush  x    将单字节x∈[-128,127]转换为Integer (4字节)入栈,
       2: istore_1             //   从栈顶pop(弹栈)出值这里就是8存储到第1个本地变量中,即a
       3: iload_1             //  将第一个本地变量入栈,即是a的值入栈
       4: iload_1             //  将第一个本地变量入栈,即是a的值入栈
       5: iload_1         //  将第一个本地变量入栈,即是a的值入栈,此时栈内已经有三个变量了,值都是8,从栈顶到栈底上到下编个号3,2,1
       6: bipush        10   // 如同第一步操作将10入栈,10是栈顶
       8: iadd           // 加法运算:运算的时候都是从栈顶弹出2个参数,将结果压入栈顶,10与3号变量做加法,结果为18,此时栈顶为18
       9: isub           //减法运算与加法运算操作类似,2号变量与18做减法,结果为-10,栈顶为-10
      10: dup       //复制栈顶元素压入栈顶,此时栈顶为-10,栈顶的下面的值依次为-10,8
      11: istore_1    //栈顶弹栈将值赋给第一个本地变量a,栈内还剩下-10,和8
      12: iadd        //做加法操作,结果为-2
      13: istore_1  //弹栈将值赋给第一个本地变量a
      14: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      17: iload_1
      18: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      21: return
}
可以看到第 3,4,5步操作: iload_1就是将三个a,就是3个8压入栈.
a = a + (a=a-(a+10));
/*
*从左往右数,第二个a,第四个和第五个a的值就是8
*/

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧