java学习基地

微信扫一扫 分享朋友圈

已有 279 人浏览分享

Java篇——运算顺序的详细挖掘

[复制链接]
279 0

java篇——运算挨次当标细发掘
正在 Java 运算中,存正在一些干系到挨次的计较,那些计较挨次正在 C / C++言语中是没有肯定的,而且最初的成果值也出有包管。不外, Java 颠末编译以后,天生的是取仄台无闭的字节码,而且交互工具为 Java 假造机,取蹬鲢的硬件情况无闭。因而,那些运算成果正在 Java 中是肯定的。
从左背左的计较挨次
取 C / C++差别的是,正在 Java 中,表达式的计较取成果是肯定的。没有受硬件情况的影响。比方,一个正在 C / C++中比力常睹例子:
int i = 5;
int j = (i++) + (i++) + (i++);
赶钙代码

正在 C / C++中,变量 i 取 j 的值是没有肯定的,按照差别的开辟情况,成果也没有不异。比方,正在 Turbo C 中, i 的值为 8, j 的值为 15,而正在 VC 中, i 的值为 8, j 的值为 18。正在 Java中, i战 j 的值是肯定的, i 为 8, j 为 18。
正在 Java 中,操纵数的计较挨次是从左背左的也便是起首管帐算左边的操纵数,然后再计较其右边的操纵数。比方:
int a = 3;
int b = a + (++a) + (a = 1) + a;
赶钙代码

施行那两个语句以后, a 的值为 1, b 的值为 9。由于 Java 便是从左背左停止计较的,刮差后(即最右边)一条修正 a 值的表达式为:
a = 1
赶钙代码

而第 2 条语句也便是:
int b = 3 + 4 + 1 + 1;
赶钙代码

操纵数从左背左的计较划定规矩取运算符的分离性无闭,便算运算符是由左背左分离的,颐挥嗅正在运算之前先肯定左边的操纵数,请看上面的法式。
【例】 操纵数确实定。
package chapter2;
2.
3. import java.util.Arrays;
4.
5. public class Order {
6. public static void main(String[] args) {
7. int a[] = new int[] {
8. 0, 0, 0, 0, 0, 0
9. };
10. int i = 1;
11. a[++i] = i++;
12. System.out.println("i=" + i);
13. System.out.println(Arrays.toString(a));
14. int j = 3;
15. a[j] = j = 4;
16. System.out.println("j=" + j);
17. System.out.println(Arrays.toString(a));
18. int b[] = new int[] {
19. 9, 9, 9, 9, 9, 9
20. };
21. int k = 5;
22. int c[] = a;
23. a[--k] = (a = b)[k];
24. System.out.println("k=" + k);
25. System.out.println(Arrays.toString(a));
26. System.out.println(Arrays.toString(b));
27. System.out.println(Arrays.toString(c));
28. }
29.}
赶钙代码

法式运转成果以下:
i=3
[0, 0, 2, 0, 0, 0]
j=4
[0, 0, 2, 4, 0, 0]
k=4
[9, 9, 9, 9, 9, 9]
[9, 9, 9, 9, 9, 9]
[0, 0, 2, 4, 9, 0]
赶钙代码

您猜测准确了吗?关于法式第 11 止:
a[++i] = i++;
赶钙代码

固然赋值运算符是从左背左分离的,可是操纵数确实定是从左背左的,也便实邻赋值操纵发作前,起首会肯定左边的操纵数, i 的值为 1, ++i 的值便是 2,因而,左边的操纵数是 a[2],因而,那条语句便相称于:
a[2] = 2;
赶钙代码

然后 i 的值再减 1,值为 3。
第 15 止的赋值语句:
a[j] = j = 4;
赶钙代码

也是一样的原理,起首肯定左边操纵数,j 的值为 3,也便是 a[3],那相称于:
a[3] = j = 4;
赶钙代码

赋值以后, j 战 a[3]的值皆是 4。
一样,第 23 止的语句:
a[--k] = (a = b)[k];
k 的值是 5,那便相称于:
--k;
int[] temp = a;
a = b;
temp[4] = b[4];
赶钙代码

然后,本数组 a[4](也便是厥后的 c[4])的值改动。
盖镆算符
我们明白,盖镆算符能够主动将右边运算的成果范例转话讵左边操纵数的范例。比方以下的代码:
byte b = 1;
b = b + 1; //毛病
b += 1; //准确
赶钙代码

由于常量 1 为 int 范例,以是右边的成果是 int 范例,不克不及赋值给一个 byte 范例的变量,但
是利用盖镆算符( +=)是能够的,第 3 条语句相称于:
b = (byte)(b + 1);
赶钙代码

除此以外,盖镆算符也有沙脉的性子,即遵照操纵数从左背左计较的准绳,也便是道,正在施行赋值操纵之前,起首会肯定左边的操纵数。
【例】 盖镆算符。
1.        package chapter2;
2.
3. import java.util.Arrays;
4.
5. public class Order2 {
6. public static void main(String[] args) {
7. int a = 10;
8. a += ++a;
9. System.out.println("a=" + a);
10. int[] array = new int[] {
11. 8, 9, 10
12. };
13. int b = 1;
14. array[b] *= b = 2;
15. System.out.println("b=" + b);
16. System.out.println(Arrays.toString(array));
17. }
18.}
赶钙代码

因为有两粝里的解说,那个法式的运转成果该当没有易设想了,以下:
a=21
b=2
[8, 18, 10]
赶钙代码

总之,运算前会先将左边的操纵数保留起去,左边的操纵数没有会遭到其右边表达式的影响而形成改动。
总结:
1.正在 Java 言语中,操纵数的计较挨次是从左背左的,即便运算符是从左背左分离的也是
云云。
2.取 C / C++等言语差别, Java 的运算成果受硬件情况的影响很小,计较方法也是肯定的。
触类旁通
正在参数通报的过程当中,能否也契合本话题报告的划定规矩呢?比方上面的法式:
1.package chapter2;
2.
3. public class Order3 {
4. public static void main(String[] args) {
5. Order3 order = new Order3();
6. int i = 10;
7. order.test(i, ++i, i = 2);
8. order.test(i = 5, i++, i);
9. }
10.
11. public void test(int x, int y, int z) {
12. System.out.println(x);
13. System.out.println(y);
14. System.out.println(z);
15. }
16.}
赶钙代码

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

129

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-5-7 19:26 , Processed in 0.265635 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.