java执行下面的代码:
        int a = 12;
     int b = 123;
     a = b + (b = a) * 0;
     System.out.println("a="+a);
     System.out.println("b="+b);        答案:
            a=123;b=12; 为什么????

解决方案 »

  1.   

    b = a所以b=12
    a = b + (b = a) * 0;  a=123,运算从左到右
      

  2.   

    按照java运算符的优先级别来讲,运算不是从左到右的吧
      

  3.   

    Java中的如何一种运算符都是有自身的优先级的,运算的时候是根据优先级来进行的!
      

  4.   

    b = a,这是一个赋值表达式啊!你把12赋给b 了,所以 b 结果为12啊!
      

  5.   

    a = b + (b = a) * 0; 
        System.out.println("a="+a); 
    这又是个编译器上读取的问题,估计用的堆栈,先进后出,()内先进,所以最后出来,然后是乘法先进,倒数第二出来,结果就成了这个样子,要彻底搞清楚的话,要读编译器的汇编代码
      

  6.   

    在JAVA中“=”是赋值号。
    在a = b + (b = a) * 0中b的值已经更改了
    剩下的就是优先级的问题了,()优先级最高,“*”号次之
      

  7.   

    看看java class字节码,就不难得出答案     "java bytecode"   "local variable"     stack     0  bipush 12                            [12]
         2  istore_1 [a]    a = 12               []
         3  bipush 123                           [123]
         5  istore_2 [b]    b = 123              []
         6  iload_2 [b]                          [123]
         7  iload_1 [a]                          [12, 123]
         8  dup                                  [12, 12, 123]
         9  istore_2 [b]    b = 12               [12, 123]
        10  iconst_0                             [0, 12, 123]
        11  imul                                 [0, 123]
        12  iadd                                 [123]
        13  istore_1 [a]    a = 123              []
      

  8.   


    c、c++答案跟java、c#一样的,运算顺序不一样的
      

  9.   

    你可以先看看java的基础语法,就会明白的。这里a,b都是变量,不是常数,所以会根据以后的情况而改变数值的,b值改变就是因为进行了b = a的计算。
      

  10.   


    没那么麻烦,给你说简单点。
    这是个赋值运算,要知道a的值,要看给a赋得什么值。
    “a = b + (b = a) * 0;”“(b = a) * 0”整体为零。则“a=b+0”
    给a 赋值为b。 
    再看给b赋的值,(b=a)把a的值赋给了b。
    现在a的值与b的值交换了。
    就这样。
      

  11.   


    http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javap.html看看这个吧
      

  12.   

    深入了解每一个细节
    祝你早日成为Java界泰斗
      

  13.   

    int a = 12; 
    int b = 123; a = b + (b = a) * 0; 上面的公式步骤应该是:
    a = 123 + (b = a) * 0; 
    a = 123 + (b = 12) * 0; //将12赋值给b 
    a = 123 + 12 * 0; 
    a = 123所以最后a = 123; b = 12
      

  14.   

    int a = 12; 
    int b = 123; 
    a = b + (b = a) * 0;
    代码是先运算了(b=a),在此处b已经被赋值12,所以b=12;然后运算(b = a) * 0 此部分整体为0,后运算a = b + (b = a) * 0,
    即变为a=b+0 所以a=123
    想不用第三参数进行值交换甚至不用0,可以这样写
             int a = 111;
            int b = 222;
            b = a + b;
            a = b-a;
            b = b-a;
            System.out.println(a + "==aaa");
            System.out.println(b + "==bbb");
      

  15.   

    这个貌似没见过
    只见过
    a = a ^ b;
    b = b ^ a;
    a = a ^ b;
    学习了
      

  16.   

        a = b + (b = a) * 0;
        System.out.println("a="+a);
        System.out.println("b="+b);
        从代码来看b=12很容易理解,因为把a的值12赋给了b ,所以b的值为12   然而a为什么是123,而不是12这个问题就要考虑到jvm的执行方式了
        比如:int i = 1;
              i = i ++;
              Sytem.out.println(i); 
              为什么打印出来i的值是1而不是我们想的2;
            这也不能用简单的逻辑所能说明的!只能考虑到jvm了,所以楼主你如果要弄清还是建议你去看下jvm的执行原理,就可以解决上面是为什么那样的结果了!!
      

  17.   

    b = a  这儿赋值了。java更多教程  http://www.java1995.cn/wiki/topic/2 
      

  18.   

    运算符的优先级这里就不说了。
    因为 在运行时候  b = a 这时候,b 当然就是12了
    而a为什么等于 123呢
    在运算时,(a = b) 这个表达式返回的是false ,(b = a) * 0   也就是  0 * 0 
    所以 a = b + 0;
    故: a = 123;
      

  19.   

    楼主,是这样的,真的是从左到右执行的, 你先看你第一句要求输出a的值,然后,它就看最后一次a是被谁给赋值了,它找到了那句最难懂的代码,从左到右开始解读,它首先看到B,然后把b的赋值123拿出来,然后看到后一个乘法,这个时候不管括号里的值是等于123或者是12都无所谓,因为它乘以0,所以还是0,  所以这时候=号右边的值实际上只有b赋值给了a,  所以a=123我们再来看,要求输出b的值道理也是一样的.
    虚拟机找到了最后一次赋值的表达式,就是那个括号里的b=a; 后来再也没有赋值给b过了,所以b=12;这是我的理解,希望对你有帮助.
      

  20.   

    这是因为: Java 是 从左向右扫描表达式的,扫描到表达式中的变量,它会先读取变量值,然后入栈,因为是从左向右扫描,所以读取第一个b的时候是123, 不会受到后面(b=a)的影响。懂了吧?下面这道题如果你答对,相信你就明白了int ai = 1;
    int sum = ai + (++ai) + ai++ + ai;
    System.out.println("sum:" + sum);
      

  21.   

    a = b + (b = a) * 0;你把a的值赋给了b你说a现在变成多少了呢?
      

  22.   

    [Quote=引用楼主 aa746895182 的回复:]
        java执行下面的代码:
            int a = 12;
        int b = 123;
        a = b + (b = a) * 0;
        System.out.println("a="+a);
        System.out.println("b="+b);        答案:
                a=123;b=12; 为什么????
    可以简单的从右边往左边看
    a的初始值是12,b的初始值是123
    在a=b+(a=b)*0的运算中a(a=b)“a赋值给了b,所以最后b=12”,“(a=b)*0的值是0,b+0 在赋值给a,即a=123”,这个属于运算优先级的知识吧
      

  23.   

    让更多的人认识java的最底层。up!!
      

  24.   

    a = b + (b = a) * 0;  a=123,运算从左到右 
    即把a的值赋给了b 
      

  25.   

    见识了!又多了点对JAVA的认识!
      

  26.   

    0乘以任何数都等于0,所以a = b + 0,a为123。
    最后一行括号中a已经赋给b了,所以b为12。
      

  27.   


    a = b + (b = a) * 0; 关键是这一句的执行顺序问题。a=12,
    b=123执行顺序是:
    b = a; -->执行后,b为12
    (b = a) * 0; -->计算结果为0
    b + (b = a) * 0;  -->计算结果为123+0=123
    a = b + (b = a) * 0;  -->执行后,a为123所以,a=123,b=12。
      

  28.   


    我想问问80楼的同学,在第一步中 b=12 
    那么在第三步中b + (b = a) * 0;  -->计算结果应该为12+0=12吧
    为什么是123呢?
      

  29.   

    我debug过了, 执行顺序确实是从左到右。
      

  30.   

    java执行下面的代码: 
            int a = 12; 
        int b = 123; 
        a = b + (b = a) * 0; 
        System.out.println("a="+a); 
        System.out.println("b="+b);         答案: 
                a=123;b=12; 为什么????
     先算括号 b = 12
    再算乘法 12*0=0
    在赋值 a = 123 + 0;
    还有他是从上往下逐行运行
    当运行到System.out.println("b= " + b);的时候回调用它最近的一个b。 
    不知道这样理解对不 因为我才开始学java
      

  31.   

    哈哈,这样试下就明白:a = (b = a) * 0 + b;