最近刚重拾编程序的工作,说实话内心是崩溃的,不该会的还是不会,该会的也忘记了。所以决定开博客来记录自己每天的重拾历程。

就从简单的java运算开始,本文主要介绍基础运算符的操作数类型,运算符关系,优先级,以及不同类型的运算结果。

Java的运算符可分为4类:算术运算符、关系运算符、逻辑运算符和位运算符.

1.算术运算符 

Java的算术运算符分为一元运算符和二元运算符.一元运算符只有一个操作数;二元运算符有两个操作数,运算符位于两个操作数之间.算术运算符的操作数必须是数值类型.

(1)一元运算符: 

一元运算符有:正(+)、负(-)、加1(++)和减1(--)4个.

加1、减1运算符只允许用于数值类型的变量,不允许用于表达式中.加1、减1运算符既可放在变量之前(如++i),也可放在变量之后(如i++),两者的差别是:如果放在变量之前(如++i),则变量值先加1或减1,然后进行其他相应的操作(主要是赋值操作);如果放在变量之后(如i++),则先进行其他相应的操作,然后再进行变量值加1或减1. 

例如: 

int i=6,j,k,m,n;

j = +i; //取原值,即j=6

k = -i; //取负值,即k=-6

m = i++; //先m=i,再i=i+1,即m=6,i=7

m = ++i; //先i=i+1,再m=i,即i=7,m=7

n = j--; //先n=j,再j=j-1,即n=6,j=5

n = --j; //先j=j-1,再n=j,即j=5,n=5

在书写时还要注意的是:一元运算符与其前后的操作数之间不允许有空格,否则编译时会出错.

(2)二元运算符 

二元运算符有:加(+)、减(-)、乘(*)、除(/)、取余(%).其中+、-、*、/完成加、减、乘、除四则运算,%是求两个操作数相除后的余数.

%求余操作举例: 

a % b = a - (a / b) * b

取余运算符既可用于两个操作数都是整数的情况,也可用于两个操作数都是浮点数(或一个操作数是浮点数)的情况.当两个操作数都是浮点数时,例如7.6 % 2.9时,计算结果为:7.6 - 2 * 2.9 = 1.8.

当两个操作数都是int类型数时,a%b的计算公式为:

a % b = a - (int)(a / b) * b

当两个操作数都是long类型(或其他整数类型)数时,a%b的计算公式可以类推. 

当参加二元运算的两个操作数的数据类型不同时,所得结果的数据类型与精度较高(或位数更长)的那种数据类型一致. 

例如: 

7 / 3 //整除,运算结果为2

7.0 / 3 //除法,运算结果为2.33333,即结果与精度较高的类型一致

7 % 3 //取余,运算结果为1

7.0 % 3 //取余,运算结果为1.0

-7 % 3 //取余,运算结果为-1,即运算结果的符号与左操作数相同

7 % -3 //取余,运算结果为1,即运算结果的符号与左操作数相同 

2.关系运算符 

关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型的数值.关系运算符有六个:等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于()、左移(>). 

位运算的位与(&)、位或(|)、位非(~)、位异或(^)与逻辑运算的相应操作的真值表完全相同,其差别只是位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑值. 

位运算示例

运算符 名称 示例 说明 

& 位与 x&y 把x和y按位求与

| 位或 x|y 把x和y按位求或

~ 位非 ~x 把x按位求非

^ 位异或 x^y 把x和y按位求异或

>> 右移 x>>y 把x的各位右移y位

右移 x>>>y 把x的各位右移y位,左边填0 

举例说明:

(1)有如下程序段:

int x = 64; //x等于二进制数的01000000

int y = 70; //y等于二进制数的01000110

int z = x&y //z等于二进制数的01000000

即运算结果为z等于二进制数01000000.位或、位非、位异或的运算方法类同.

(2)右移是将一个二进制数按指定移动的位数向右移位,移掉的被丢弃,左边移进的部分或者补0(当该数为正时),或者补1(当该数为负时).这是因为整数在机器内部采用补码表示法,正数的符号位为0,负数的符号位为1.例如,对于如下程序段:

int x = 70; //x等于二进制数的01000110

int y = 2;

int z = x>>y //z等于二进制数的00010001

即运算结果为z等于二进制数00010001,即z等于十进制数17.

对于如下程序段:

int x = -70; //x等于二进制数的11000110

int y = 2;

int z = x>>y //z等于二进制数的11101110

即运算结果为z等于二进制数11101110,即z等于十进制数-18.要透彻理解右移和左移操作,读者需要掌握整数机器数的补码表示法.

(3)0填充的右移(>>>)是不论被移动数是正数还是负数,左边移进的部分一律补0. 

5.其他运算符 

(1)赋值运算符与其他运算符的简捷使用方式 

赋值运算符可以与二元算术运算符、逻辑运算符和位运算符组合成简捷运算符,从而可以简化一些常用表达式的书写. 

赋值运算符与其他运算符的简捷使用方式

运算符 用法 等价于 说明

+= s+=i s=s+i s,i是数值型

-= s-=i s=s-i s,i是数值型

*= s*=i s=s*i s,i是数值型

/= s/=i s=s/i s,i是数值型

%= s%=i s=s%i s,i是数值型

&= a&=b a=a&b a,b是逻辑型或整型

|= a|=b a=a|b a,b是逻辑型或整型

^= A^=b a=a^b a,b是逻辑型或整型

i s,i是整型

>>>= s>>>=i s=s>>>i s,i是整型 

(2)方括号[]和圆括号()运算符 

方括号[]是数组运算符,方括号[]中的数值是数组的下标,整个表达式就代表数组中该下标所在位置的元素值.

圆括号()运算符用于改变表达式中运算符的优先级.

(3)字符串加(+)运算符 

当操作数是字符串时,加(+)运算符用来合并两个字符串;当加(+)运算符的一边是字符串,另一边是数值时,机器将自动将数值转换为字符串,这种情况在输出语句中很常见.如对于如下程序段:

int max = 100;

System.out.println("max = "+max);

计算机屏幕的输出结果为:max = 100,即此时是把变量max中的整数值100转换成字符串100输出的.

(4)条件运算符(?:) 

条件运算符(?:)的语法形式为:

? : 

条件运算符的运算方法是:先计算的值,当的值为true时,则将的值作为整个表达式的值;当的值为false时,则将的值作为整个表达式的值.如:

int a=1,b=2,max;

max = a>b?a:b; //max等于2

(5)强制类型转换符

强制类型转换符能将一个表达式的类型强制转换为某一指定数据类型,其语法形式为:

()

(6)对象运算符instanceof 

对象运算符instanceof用来测试一个指定对象是否是指定类(或它的子类)的实例,若是则返回true,否则返回false.

(7)点运算符 

点运算符“.”的功能有两个:一是引用类中成员,二是指示包的层次等级. 

6.运算符的优先级 

以下按优先级从高到低的次序列出Java语言中的所有运算符,表中结合性一列中的“左右”表示其运算次序为从左向右,“右左”表示其运算次序为从右向左.

优先级 运算符 结合性 

1 . [] () ; , 

2 ++ ―― += ! ~ +(一元) -(一元) 右左

3 * / % 左右

4 +(二元) -(二元) 左右

5 > >>> 左右

6 < > = instanceof 左右

7 = = != 左右

8 & 左右

9 ^ 左右

10 | 左右

11 && 左右

12 || 左右

13 ?: 右左

14 = *= /= %= += -= = >>>= &= ^= |= 右左

7  运算符中的数据类型转换

对于单目(一元)运算符,例如++或者--,隐式转换比较简单,byte,short,char类型的数据被转换成int的,其他类型的数据保持不变。

对于双目运算符,情况比较复杂,但是这种转换基本遵循如下基本方式:表达式中最长的类型为表达式的类型。

    1.两个操作数如果有一个是double,则另一个也将会转变成double,最后的计算结果也是double。

两个操作数如果有一个是float,则另一个也将会转变成float,最后的计算结果也是float。

两个操作数如果有一个是long,则另一个也将会转变成long,最后的计算结果也是long。