运算符的优先级别

发表时间:2017-05-08 14:54:11 浏览量( 48 ) 留言数( 0 )

一、运算符的优先级

在一系列复杂的运算符中,优先级较高的运算符总是先被运算,然后才按照优先级的高低依次完成所有计算,在前面的章节中我们也简单了提到了一些运算符的优先顺序,其中优先级最高的是小括号括号:”(...)”,多个括号分割运算表达式会让一个复杂的表达式变得更具有可读性。其他的运算符按照优先级别的高低排序分别是:自加/减运算符、 算术运算符、比较运算符、逻辑运算符、赋值运算符。具体请参考下表:

顺序

运算符

1.

括号,如 ( ) 和   [ ]     

2.

一元运算符,如 -、++、- -和 !

3.

算术运算符,如 *、/、%、+ 和 -

4.

关系运算符,如 >、>=、<、<=、== 和 !=

5.

逻辑运算符,如 &、^、|、&&、||

6.

条件运算符和赋值运算符,如   ? :、=、*=、/=、+= 和 -=

当两个运算符拥有同样优先级时跟代数的四则运算一样,从左到右依次执行表达式。当要表示一个比较复杂的运算表达式时,最好多使用小括号,可以使用表达式更加清晰,对于一些比较复杂的,尽量可以分开多个步骤,这样虽然可能会降低效率,但是可以提高代码的可读性。比如下面这个例子:

   		int i=1,j=2;
		int a=i+++j+++i++;
		System.out.println(a);


看着就让人头晕了,我们可以修改以下这样。

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


二、类型转换

我们在写运算符时,经常会碰到一个运算符中包含好几个不同数据类型的参数,这就涉及到数据类型的转换。java有两种类型的转换,分别是自动类型转换和强制类型转换。

1、自动类型转换

 一般而言,java编译器还是比较智能的,对不同数据类型的参数,会自动转换类型,为了不至于数据的丢失,一般是较窄的数据类型转换为较宽的数据类型。也就是说如果一个short类型和一个int类型相加,那么结果就会自动转换为int类型,因为int比short数位要宽,再有如果int类型和float类型相加,那么结果是float类型,因为浮点型比整型所能表示的数据要宽。另外我们也可以把一个较窄的数据类型直接赋值给一个较宽的数据类型。总结一下,在赋值或者计算时,只要满足以下条件,就会发生自动类型转换:

(1)两种类型兼容;

(2)目标类型大于源类型;

 例如:

 (1)byte、char和 short 型值可提升为 int 型。如果一个操作数为 long 型,则整个表达式结果为 long 型

 (2)如果一个操作数为 float 型,则整个表达式结果为 float 型。而如果一个操作数为 double 型,则整个表达式结果为 double 型

2、 强制类型转换

强制转换用于显式类型转换。但是强制类型转换需要小心使用,因为如果被转换的值的数据类型大于其目标类型,就会丢失部分信息。类型强制转换使程序将变量视为某种类型,尽管此变量中包含的是另一类型的数据,其具体格式如下:

(类型名)表达式

示例:

   		double a = 346.756565f;
		int b = (int) a + 10;
		System.out.println(b);

最后的结果是356,浮点型a后面的所有的小数都会丢失。