运算符

来源:互联网 发布:模拟登陆知乎 编辑:程序博客网 时间:2024/05/18 20:32


运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等。

Java语言使用运算符将一个或多个操作数连缀成执行性语句,用以实现特定功能。

Java语言中的运算符可分为如下几种:

1),算术运算符

2),赋值运算符

3),比较运算符

4),逻辑运算符

5),位运算符

6),类型相关运算符。


算术运算符

Java支持所有的基本算术运算符,整理一下一共有7种。

1),加法运算符。使用"+"做加法运算符,注意,"+"还可以作为字符串的连接运算符

2),减法运算符。使用"-"做减法运算符。注意,"-"还可以作为求负的运算符

3),乘法运算符。使用"*"做乘法运算符。

4),除法运算符。使用"/"做除法运算符。

除法运算符有些特殊,如果出发运算符的两个操作数都是整数类型,则计算结果也是整数,就是将自然除法的结果截断取整,比如19/4,结果是4,不是5。

如果除法运算符的两个操作数都是整数类型,则除数不可以是0,否则将引发除以零异常。

如果除法运算符的两个操作数有一个是浮点数,或者两个都是浮点数,则计算结果也是浮点数。这个结果就是自然除法的结果。

此时允许除数是0,或者0.0,得到结果是正无穷大或负无穷大。

5),求余运算符。使用"%"做求余运算符。求余运算的结果不一定总是整数,他的计算结果是使用第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数。

由于求余运算也需要进行除法运算,因此如果求余运算的两个操作数都是整数类型,则求余运算的第二个操作数不能是0,否则将引发除以零异常。

如果求余运算的两个操作数中有一个或者两个都是浮点数,则允许第二个操作数是0或0.0,只是求余运算的结果是非数NaN。

0或者0.0对零以外的任何数求余都将得到0或0.0。

public static void main(String[] args){int a = 1;int b = 2;// 使用+做加法运算int c = a + b;// 使用-做算法运算int d = a - b;// 使用*做乘法运算int e = a * b;// 使用/做除法运算int f = a / b;// 使用%做求余运算int g = a % b;}

6),自加。使用"++"做自增运算。自加运算符有两个要点:

第一,自加是单目运算符,只能操作一个操作数

第二,自加运算符只能操作单个数值型的变量,不能操作常量或表达式。

运算符既可以出现在操作数的左边,也可以出现在操作数的右边,出现在左边和右边效果不一样

如果把"++"放在左边,则把操作数加1然后才把操作数放入表达式中运算,

如果把"++"放在右边,则先把操作数放入表达式中运算,然后才把操作数加1。

7),自减。使用"--"做自减运算。

自减运算也是单目运算符,用法和"++"基本类似,只是将操作数的值减1。

注意:自加和自减只能用来操作变量,不能用于操作数值直接量,常量或表达式,比如5++,7--等写法都是错误的。

public static void main(String[] args){// a++,先使用a的值,然后再+1int a = 1;System.out.println("对a做自加:" + a++);System.out.println("自加后a的值:" + a);// ++b,先+1,然后再使用b的值int b = 1;System.out.println("对b做自加:" + ++b);System.out.println("自加后b的值:" + b);}
控制台输出如下:

对a做自加:1自加后a的值:2对b做自加:2自加后b的值:2

Java并没有提供其他更加复杂的运算符,如果需要完成乘方,开方,随机数等运算,则可借助Java.lang.Math类的工具方法来完成。

Math类下包含了丰富的静态方法,用来完成各种复杂的数学运算。具体的这块Java常用类我会在后面的一系列博客中整理,这里不做赘述。


赋值运算符

赋值运算符用于为变量指定变量值,与C类似,Java也使用"="作为赋值运算符。

通常,使用赋值运算符将一个直接量值赋给变量,也可以使用赋值运算符将一个变量的值赋给另外一个变量。

前面已经整理过变量的概念了,可以把变量当成一个可盛装数据的容器,而赋值运算就是将被赋的值装入变量的过程,赋值运算符是从右向左执行计算的,程序先计算得到"="右边

的值,然后将该值装入"="左边的变量,因此赋值运算符"="左边只能是变量。

赋值运算符支持连续赋值,通过使用多个赋值运算符,可以一次为多个变量赋值。

public static void main(String[] args){int a, b, c;a = b = c = 7;}

注意:虽然Java支持这种一次为多个变量赋值的写法,但这种写法导致程序的可读性降低,因此不推荐这么写。


位运算符

Java支持的位运算符有如下7个:

1),&,按位与,当两位同时为1时才返回1。

2),|,按位或,只要有一位为1即可返回1。

3),~,按位非。单目运算符,将操作数的每个位全部取反。

4),^,按位异或。当两位相同时返回0,不同时返回1。

5),<<,左移运算符。

6),>>,右移运算符。

7),>>>,无符号右移运算符。

一般来说,位运算符只能操作整数类型的变量或值




扩展后的赋值运算符

赋值运算符可以与算术运算符,位移运算符结合,扩展成功能更加强大的运算符。扩展后的赋值运算符如下:

1),+=,对于x += y,即对应于x = x+y。

2),-=,对于x -= y,即对应于x = x-y。

3),*=,对于x *= y,即对应于x = x*y。

4),/=,对于x /= y,即对应于x = x/y。

5),%=,对于x %= y,即对应于x = x%y。

6),&=,对于x &= y,即对应于x = x&y。

7),|=,对于x |= y,即对应于x = x|y。

8),^=,对于x ^= y,即对应于x = x^y。

只要能使用这种扩展后的赋值运算符,通常都推荐使用它们。因为这种运算符不仅具有更好的性能,而且程序会更加健壮。

注意下面的代码,a = a+5 和 a += 5虽然运行结果相同,但底层的运行机制还是存在一定差异的,也就是说这种扩展的赋值运算符底层不会帮我们做类型的自动转换。

public static void main(String[] args){byte a = 5;// 下面语句报错。上面语句5默认类型是int,把int类型赋值给byte类型,编译不过。a = a + 1;byte b = 5;// 下面语句正确。可以看得出来,a = a+b 和 a +=b底层运行机制还是有一定差异的b += 1;}



比较运算符

比较运算符用于判断两个变量或常量的大小,比较运算的结果是一个boolean值(true或者false),Java支持的比较运算符如下:

1),>,大于,只支持左右两边操作数是数值类型,如果前面变量的值大于后面变量的值,则返回true。

2),>=,大于等于,只支持左右两边操作数是数值类型,如果前面变量的值大于等于后面变量的值,则返回true。

3),<,小于,只支持左右两边操作数是数值类型,如果前面变量的值小于后面变量的值,则返回true。

4),<=,小于等于,只支持左右两边操作数是数值类型,如果前面变量的值小于等于后面变量的值,则返回true。

5),==,等于,如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true。

如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象才会返回false。

Java也支持两个boolean类型的值进行比较,比如,true == false,将返回false。

6),!=,不等于,上面等于的取反。

注意:Java为所有的基本数据类型都提供了对应的包装类,关于包装类实例的比较有些特殊,具体我会专门整理,这里不做赘述。


逻辑运算符

逻辑运算符用于操作两个boolean类型的变量或常量。逻辑运算符主要有如下6个。

1),&&,与,前后两个操作数必须都是true才返回true,否则返回false。

2),&,不短路与,作用与&&相同,但不会短路。

3),||,或,只要两个操作数中有一个是true,就可以返回true,否则返回false。

4),|,不短路或,作用与||相同,但不会短路。

5),!,非,只需要一个操作数,如果操作数为true,返回false,如果操作数为false,返回true。

6),^,异或,当两个操作数不同时返回true,如果两个操作数相同则返回false。

上面的这些逻辑比较简单,关于短路和不短路,写一段代码来对比下区别。

public static void main(String[] args){int a = 1;int b = 2;if (a > 0 || b++ > 0){// 下面语句输出-->短路后a的值:1;b的值:2System.out.println("短路后a的值:" + a + ";b的值:" + b);}int c = 1;int d = 2;if (c > 0 | d++ > 0){// 下面语句输出-->短路后c的值:1;d的值:3System.out.println("短路后c的值:" + c + ";d的值:" + d);}}



三目运算符

三目运算符只有一个:(?:),语法格式如下:(expression)?if-true-statement:if-false-statement;

大部分时候,三目运算符都是作为if else的精简写法。

三目运算符的规则是:先对逻辑表达式expression求值,如果逻辑表达式返回true,则返回第二个操作数的值,如果逻辑表达式返回false,则返回第三个操作数的值。

public static void main(String[] args){int a = 1;int b = 2;String result = a > b ? "a大于b" : "a小于b";System.out.println(result);}



运算符的结合性和优先级

所有的数学运算都认为是从左向右运算的,Java语言中大部分运算符也是从左向右结合的,只有单目运算符,赋值运算符,三目运算符例外,这三个运算符是从右向左结合的,也

就是从右向左运算的。

运算符有不同的优先级,所谓的优先级就是在表达式运算中的运算顺序。下表列出了包括分隔符在内的所有运算符的优先级顺序,上一行中的运算符总是优先于下一行的。


关于运算符的建议:

1),不要把一个表达式写的过于复杂,如果一个表达式过于复杂,则可以把他分成几步来完成

2),不要过多的依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序


1 0