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
java基础(四) java运算顺序的深入解析的更多相关文章
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
- Java基础技术-Java其他主题【面试】
Java基础技术-Java其他主题[面试] Java基础技术IO与队列 Java BIO.NIO.AIO Java 中 BIO.NIO.AIO 的区别是什么? 含义不同: BIO(Blocking I ...
- 黑马程序员:Java基础总结----java注解
黑马程序员:Java基础总结 java注解 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...
- java基础-学java util类库总结
JAVA基础 Util包介绍 学Java基础的工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java基础-使用JAVA代码剖析MD5算法实现过程
Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 《温故而知新》JAVA基础四
类的封装 定义:将类的一些信息隐藏起来,不允许外部的程序直接的访问,而是通过该类提供的一些方法来获取 好处:只能通过特定的法方法访问数据,保护了数据, 实现封装的步骤: 修改属性的可见性:(一般类属性 ...
- Java基础(四) StringBuffer、StringBuilder原理浅析
StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 关于String的讲解请看Java基础 ...
- java 基础 四种权限修饰符
/** * Java有四种权限修饰符: * public > protected > (default) > private * 同一个类 YES YES YES YES * 同一个 ...
随机推荐
- if嵌套语句 shell脚本实例 测试是否闰年
在 if 语句里面,你可以使用另外一个 if 语句.只要你能逻辑管理 你就可以使用多层嵌套. 以下是一个测试闰年的例子: #!/bin/bash # This script will test if ...
- (转) mysql之status和variables区别及用法详解
原文:http://blog.csdn.net/andyzhaojianhui/article/details/50052117
- nodejs(三) --- nodejs进程与子进程
嗯,对于node的学习还远远不够,这里先做一个简单的api的记录,后续深入学习. 第一部分:nodejs中的全局对象之process进程对象 在node中的全局对象是global,相当于浏览器中的wi ...
- sublime text3在交互时解决input()函数无法使用的问题
1,打开sublime text3工具栏,依次点击View->Show Console菜单打开命令行, 2,在命令行里 输入代码 import urllib.request,o ...
- hanlp的基本使用--python(自然语言处理)
hanlp拥有:中文分词.命名实体识别.摘要关键字.依存句法分析.简繁拼音转换.智能推荐. 这里主要介绍一下hanlp的中文分词.命名实体识别.依存句法分析,这里就不介绍具体的hanlp的安装了,百度 ...
- 再学Java 之 形参个数可变函数
自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variab ...
- DotNetOpenAuth 使用指南
这几天一直在研究DotNetOpenAuth,源码处处是坑啊!写此文只为大家更顺利掌握DotNetOpenAuth使用方法,尽量少走弯路. 说明一下:我的环境是Win7 64 VS2015 upd ...
- MYSQL 复制详解
MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据 ...
- Java虚拟机(七):JVM调优案列
Eclispe启动优化 概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代 ...
- 自动换行的两种代码(C#)
最近有个需求,需要将C# winform中的listBox中的内容自动换行, 其实在用listBox前,已经用textBox实现了大部分功能,可惜最后还是有个焦点的问题, 就是textBox中的文字会 ...