Java运算符(一篇文章让你彻底学会Java运算符)
一篇文章让你彻底学会Java运算符
首先,Java常用的运算符分为算术运算符、赋值运算符、关系运算符、逻辑运算符、 位运算符以及三元运算符。
一、算数运算符
+、-、*、/我就不多说了,只有/在Java中是做整除,其他和数学里面一样,例如下面的5/2的结果是2,叫做一刀切。
System.out.println(5/2);
%这个符号叫做模,也叫做取余,说直白点7%3就是7除3的余数是几。【不知道余数的请点击】
System.out.println(7%3);
++、–叫做自增、自减,简单点说a++相当于a+=1,也就是自增1,a–就是自减1,例如下面这个例子,int a=1;a++;输出a,所以a=2。–是一样的道理,但是++、–还有一种写法:++a、–a,【++在前和++在后的区别请点击】
int a = 1;a++;System.out.println(a);
二、赋值运算符
=是赋值符号,=左边一般是变量,右边是表达式,如int a = 10;+=、-=、*=、/=、%=是复合赋值符号,如a+=10,,等价于a = a+10;【++在前和++在后的区别请点击】
int a = 10;a += 10;//等价于a = a+10;
思考:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
三、关系运算符
关系运算符又称为比较运算符,关系运算符的返回值一定是boolean类型,一般做判断语句。
int a = 10;int b = 8;if(a>b) {System.out.println(a);}else {System.out.println(b);}
四、逻辑运算符
逻辑运算符包括:&(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或)、^(逻辑异或),是的,上面的表里面老师没有逻辑与、逻辑或、逻辑异或,原因是在有些分类里面他们也可以被称之&(按位与)、|(按位或)、^(按位异或),老师将其划分到位运算符的分类当中。想了解【&与&&的区别请点击】,下面以&&为例,我们知道&&运算是做并且,就像“我是老师,并且我是一名程序员”这句话是正确的,但是“我是老师,并且我今年18岁”,很明显这是骗人的,所以&&运算时应该是&&两边为真(true)才为真。
System.out.println(false && true);System.out.println(false && false);System.out.println(true && false);System.out.println(true && true);
总结: &&、||、!我们又经常称为与或非。 &&是当且&&两边为真才为true ;||是一边为真则为true;!是取反,真的变成假的,假的变成真的。
五、位运算符
运算符 | 含义 | 实例 | 结果 |
---|---|---|---|
& | 按位与(AND) | 5 & 12 | 4 |
| | 按位或(OR) | 11|7 | 15 |
~ | 按位取反(NOT) | ~10 | 65525 |
^ | 按位异或(XOR) | 11^7 | 12 |
<< | 左移 | 11<<1 | 22 |
>> | 右移 | 11>>1 | 5 |
关于位运算符的运算从上表中也能看出,应该是看不出什么规律,所有的运算结果都要转成二进制来计算,例如5&12的运算过程如下图,其运算规则是:先将5和12转成对应的二进制,参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。
同理,11|7的运算过程如下:简单点说,就是零零得0,其余为1
~10的运算过程:口诀,零就是1,一就是0
11^7的运算过程:口诀,相同为0,不同为1
11<<1的运算过程:左移1位相当于*2
11>1的运算过程:右移1位相当于/2
总结:
按位与(&):一一得一,其余为0
按位或(|):零零得0,其余为1
按位取反(!):零就是1,一就是0
按位异或(^):相同为0,不同为1
左移(<<):相当于*2
右移(>>):相当于/2
六、三元运算符
三元运算符又称之为条件运算符,一般语法为:
数据类型 变量名 = 布尔类型表达式?结果1:结果2
当布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。当布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。三元运算符常被用来判断返回两个数中的较大,例如下面这段代码:
int a = 10;int b = 8;System.out.println(a>b? a:b);
可以将条件运算符理解为 if-else 语句的简化形式,所以,它也等价于:
int a = 10;int b = 8;if(a>b) {System.out.println(a);}else {System.out.println(b);}
思考: int a = 10; double b = 8.0; System.out.println(a>b? a:b);是多少?
七、运算符优先级
相信大家都看到过很多张关于运算符优先级的表,这张表老师也是背不下来的,给大家提供一个记忆方式,一般情况下:算数运算符的优先级是最高的,其次是位运算符、关系运算符、逻辑运算符、最后是赋值运算符。口诀:算位关逻赋。其他细节部分,老师觉得也没有关系,其实是可以通过培养Java语感来提升的。比如,看下面几个例子:
System.out.println(2<<1+1);System.out.println(3>2<<1);System.out.println(true && 1>0);boolean a = true && false;System.out.println(a);
上面的例子可以自己口算一下答案,一眼看过去是不是感觉有点迷糊,通过口诀试下
//算>位:+是算术运算符,<<是位运算符,先算加法,所以2<<2=8System.out.println(2<<1+1);//位(<关(>),所以3>4答案是falseSystem.out.println(3>2<<1);//关>逻,所以true && true的结果为trueSystem.out.println(true && 1>0);//逻>赋boolean a = true && false;System.out.println(a);
你学会了吗?