java基础(四) java运算顺序的深入解析

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础(四) java运算顺序的深入解析

1. 从左往右的计算顺序

  与C/C++不同的是,在Java中,表达式的计算与结果是确定的,不受硬件与环境的影响。如:


int i = 5;
int j = (i++) + (i++) +(i++);

  在C/C++中,这个例子的运算结果将会根据不同的开发环境而不同。Turbo C下,j的值是15;在VC下,j的值是 18。

  在Java中,表达式的计算顺序是从左往右的,也就是先计算左侧的结果,再计算右侧的结果。上面的例子计算结果就一定是 18。也就是说,右侧 (i++)表达式使用的 i 的值 就是 左侧 (i++)表达式计算完后 i 的值,即左侧比右侧先进行运算。

看下面几个例子

@ Example 1


  int a[] = new int[]{<!-- -->0,0,0,0};
    int i = 1;
    a[i++] = i++;
    System.out.println("i="+i);
    System.out.println(Arrays.toString(a));

运行结果:

i=3 [0, 2, 0, 0]

@ Example 2


    int a[] = new int[]{<!-- -->0,0,0,0};
    int i = 1;
    a[i++] = i = 4;
    System.out.println("i="+i);
    System.out.println(Arrays.toString(a));

运行结果:

i=4 [0, 4, 0, 0]

@ Example 3


    int a[] = new int[]{<!-- -->0,0,0,0};
    int b[] = new int[]{<!-- -->1,2,3,4,5};
    int cc[] = a;
    int i = 1;
    a[++i] = (a=b)[i]; 
    System.out.println("i="+i);
    System.out.println("数组a[]: "+Arrays.toString(a));
    System.out.println("数组c[]: "+Arrays.toString(cc));

运行结果:

i=2 数组a[]: [1, 2, 3, 4, 5] 数组c[]: [0, 0, 3, 0]

2. 复合运算符的计算顺序

  复合运算符有一个特点:可以自动将右侧的运算结果类型转换成左侧操作数的类型。如:


byte b += 1;    //正确
     b = b+1;  //错误,1是整形int,所以右侧的b+1的结果是int类型。需强制转换

所以,复合类型的表达式,如 b += 1; 是相当于:


byte b = (int)(b + 1);

  除此之外, 复合运算符也是遵守操作数从右往左计算的原则。 也就是说,在执行赋值操作之前,首先会确定左侧的操作数。

看下面的几个例子:


         int a = 1;
         a += ++a;
         System.out.println(a);

运行结果:

3

  根据上面的所说的,这个程序就不难理解了,先计算左侧a的值是1,然后再计算出右侧 ++a表达式的值是 2 ,最后便是计算 1+2 的值为 3,赋值给a。

如果还是觉得难理解的,可以写成等价的普通式子,然后从左往右计算右侧的表达式。这可能比较容易理解:


a = a + ++a;

再看一个例子,加深理解:


         int a = 5;
         a *= a=2;
         System.out.println(a);

运行结果: 10

作者:jinggod 出处:

原文地址:https://sihai.blog.csdn.net/article/details/79434176

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础(四) java运算顺序的深入解析


 上一篇
java基础(一) 深入解析基本类型 java基础(一) 深入解析基本类型
一、基本类型的简介基本类型的两条准则: Java中,如果对整数不指定类型,默认时int类型,对小数不指定类型,默认是double类型。- 基本类型由小到大,可以自动转换,但是由大到小,则需要强制类型转换。 所占的字节数: byte: 1
2021-04-04
下一篇 
java基础(五) String性质深入解析 java基础(五) String性质深入解析
引言  本文将讲解String的几个性质。 一、String的不可变性  对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了。然而,String对象一经创建就不可以修改。接下来,我们一步步 分析St
2021-04-04