这个貌似不正确啊...我的课本上的答案是: 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) 这一句...
如果加上一个步骤就更清楚了 0. d = d + 1.5*3 + (++d); 1. d = 1.0 + 4.5 + 2.0 d = 7.5
d = 1.0 (d)+ 4.5 + 2.0 为什么我加括号的d的值不是2而是1呢?
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); }
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
这个貌似不正确啊...我的课本上的答案是:
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) 这一句...
0. d = d + 1.5*3 + (++d);
1. d = 1.0 + 4.5 + 2.0
d = 7.5
d = 1.0 (d)+ 4.5 + 2.0 为什么我加括号的d的值不是2而是1呢?
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);
}
1. x++ 或 ++x的时候x的值有没有改变
2. 在什么时候改变的
应该就好了再说了, 这种多半是考试/面试时候会遇到的 实际开发中很少遇到.
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 个人意见,如果不对还请大家指正....
在一个表达式中, 当 + 碰到 ()的时候, 先处理 () 里面的东西, 然后在是 +; 但是对于之前的 + 没有影响.
也就是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++中可能是处理完所有的()之后在处理 所有的 +
不同的顺序出来的结果就不一样了.
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++实现可能有关系,具体的直接看反编译代码即可。