运算符
Posted LinkinPark8林肯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符相关的知识,希望对你有一定的参考价值。
运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等。
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的值,然后再+1
int 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的值:2
System.out.println("短路后a的值:" + a + ";b的值:" + b);
int c = 1;
int d = 2;
if (c > 0 | d++ > 0)
// 下面语句输出-->短路后c的值:1;d的值:3
System.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),不要过多的依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序。
以上是关于运算符的主要内容,如果未能解决你的问题,请参考以下文章