首先,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
11^7的运算过程:口诀,相同为0,不同为1
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=8
System.out.println(2<<1+1);
//位(<<)>关(>),所以3>4答案是false
System.out.println(3>2<<1);
//关>逻,所以true && true的结果为true
System.out.println(true && 1>0);
//逻>赋
boolean a = true && false;
System.out.println(a);
你学会了吗?