double d = 1.0;
     d += 1.5*3 + (++d);
    
在JAVA中计算出式子的值是7.5,而在C++中,计算出来的值是8.5,问题是在JAVA和C++中++运算符的优先级都是比 +=运算符优先级高的.为什么会出现这样的问题...请大家指点下,谢谢了.

解决方案 »

  1.   

    计算过程是这样的:
    d += 1.5*3 + (++d); 
    步骤如下:
    1、d += 4.5 + (++d);
    2、d += 4.5 + 1.0;  //d的值是1,则++d表达式的值是1,而d的值会变成2
    3、d = d + 5.5; //d=2
    4、d = 2.0 + 5.5
    5、d = 7.5
      

  2.   


    这个貌似不正确啊...我的课本上的答案是:
    d += 1.5 * 3 + (++d); = > the value of d in the left side of += is obtained (1.0), 1.5 * 3 + (++d) = 4.5 + (++d) = 4.5 + 2.0 = 6.5, therefore, the final result a is 7.5.
    但是就是不明白the value of d in the left side of += is obtained (1.0) 这一句...
      

  3.   

    如果加上一个步骤就更清楚了
    0. d = d + 1.5*3 + (++d); 
    1. d = 1.0 + 4.5 + 2.0
    d = 7.5
      

  4.   


    d = 1.0 (d)+ 4.5 + 2.0  为什么我加括号的d的值不是2而是1呢?
      

  5.   


    sorry, 在(++d) 之前, d还是1.0.给你个sample:
    public void testPlusPlus() {
    int d = 0;
    System.out.println(d);
    System.out.println(++d);
    System.out.println(d);
    System.out.println(d++);
    System.out.println(d);
    }
      

  6.   

    C++我就不知道了 但是你只要清楚 
    1. x++ 或 ++x的时候x的值有没有改变
    2. 在什么时候改变的
    应该就好了再说了, 这种多半是考试/面试时候会遇到的 实际开发中很少遇到. 
      

  7.   

    我还想问几个问题...在JAVA中,()的优先级是最高的,那应该先算括号里的自增,d的值变为2,然后再计算余下的..按这种方法算出来的就是8.5,也就是说C++应该是这样算的但是JAVA算出来确实是7.5,我是一直想不明白这个问题.
      

  8.   

    我还想问几个问题...在JAVA中,()的优先级是最高的,那应该先算括号里的自增,d的值变为2,然后再计算余下的..按这种方法算出来的就是8.5,也就是说C++应该是这样算的但是JAVA算出来确实是7.5,我是一直想不明白这个问题.
      

  9.   

    刚查了下资料:
    JAVA中运算对象计算顺序的优先级高于运算符的优先级规则.
    例如:a=0;int x=++ a+a;因为++在左边,所以a是先自增再进行加法运算,所以x=2,
    若int x = a+(++a),因为+号是在左边,所以是先进行加法运算的,a的值先读取为0了,所以x=1;
    而C++中没有这种规则,所以
    在JAVA中:    double d = 1.0;    d += 1.5*3 + (++d); 
    是等于7.5
    而在C++中,是8.5  个人意见,如果不对还请大家指正....
      

  10.   

    java中可以这样认为 (我的个人理解)
    在一个表达式中, 当 + 碰到 ()的时候, 先处理 () 里面的东西, 然后在是 +; 但是对于之前的 + 没有影响.
    也就是int a = 0, b=1; int x = (a++) + b + (++a) 中, 
    0. x = 0 + b + (a++)
    1. a = (0++) = 1
    2. x = 0 + 1 + (a++)
    3. a = (++1) = 2
    4. x = 0 + 1 + 2而C++中可能是处理完所有的()之后在处理 所有的 + 
    不同的顺序出来的结果就不一样了.
      

  11.   

    优先级高没什么影响,jvm可以考虑为一个基于栈的计算机,前面的d是先读入的,后面再修改d对前面读入的值已经不存在影响了。
    d+=4.5+(++d);//注意4.5在编译时已经计算出来了
    处理过程是
    读取d(得到1.0,等待计算)
    读取4.5
    读取d
    读入常量1
    计算d+1,得到2.0 
    栈顶数据复制,执行d=2.0 操作,(d++要去改变d)
    计算4.5+2.0,得到6.5
    计算1.0+6.5,得到7.5
    再次赋值,d=7.5java的是比较容易理解的,因为java语言规范详细规定里这些处理规则。
    C++的规范里好像就没有那么清楚了,跟不同的C++实现可能有关系,具体的直接看反编译代码即可。