Java 中运算符与大部分主流的高级语言大同小异。所以,如果你有一定的编程基础的话,学起来会觉得相对比较容易。而且,即使你没有编程基础,但有一定的数学基础的话,学起来也会觉得相对轻松。
运算符本质是用来操作变量进行运算的一些符号,并且根据功能不同可以分为 算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符和其他运算符这几类。
算术运算符的作用就类似于我们数学中的运算符号,功能基本也是相对应的。
+
加法(将符号左右两边的操作数相加)
-
减法(符号左边的操作数减掉符号右边的操作数)
*
乘法(将符号左右两边的操作数相乘)
/
除法(符号左边的操作数除以符号右边的操作数)
%
取余(符号左边的操作数除以右边的操作数数后的余数)
++
自增(将操作数的值增加1(操作数可以在左边或者在右边))
--
自减(将操作数的值减少1(操作数可以在左边或者在右边))
测试代码:
public class Test {
public static void main(String[] arg){
int a = 13;
int b = 4;
System.out.println("a + b = "+(a + b));
System.out.println("a - b = "+(a - b));
System.out.println("a * b = "+(a * b));
System.out.println("a / b = "+(a / b));
System.out.println("a % b = "+(a % b));
System.out.println("a++ ="+(a++));
System.out.println("a-- ="+(a--));
System.out.println("++a ="+(++a));
System.out.println("--a ="+(--a));
}
}
运行结果:
a + b = 17
a - b = 9
a * b = 52
a / b = 3
a % b = 1
a++ =13
a-- =14
++a =14
--a =13
从运算结果可以知道加减乘和数学中几乎一样,而除法则是会分出商和余数两部分,商是除法的结果,余数是取余的结果。而对于自增和自减,虽然都是将操作数加一或者减一,但操作数在前或者在后结果却不一样。简单说就是:操作数在前,先运算表达式,再自增或自减;操作数在后,先自增或自减,再进行表达式的运算。
回到上面的例子,我们看到一开始 a 等于 13 ,b 等于 4。进行 a++ 操作时,操作数在前,因此会先对该表达式赋值为自增之前的值,即表达式的值为 a 的值,即 13,接着再进行自增,对 a 自增后 a 的值为 14;然后计算 a-- ,此时,操作数仍在前,同理,表达式结果为 14,自减后 a 的值为 13; 接着计算 ++a ,先自增,自增后 a 的值为 14,再为表达式赋值,此时表达式的值为 14;最后计算 --a ,同样是先自减,此时 a 的值为 13,再计算表达式的值,即输出 13 。
补充:有人问到关于除法中操作数带负号时运算结果是否与数学中一致?答案是一致的。同样也有人问那取余呢?取余时带符号可以看看以下例子。
public class Test {
public static void main(String[] arg){
int a = 13;
int b = 4;
int c = -13;
int d = -4;
System.out.println(a%b);//1
System.out.println(c%d);//-1
System.out.println(a%d);//1
System.out.println(c%b);//-1
}
}
总结成一句话:取余运算符运算结果的符号和第一个操作数的符号一致。
==
判断两个操作数是否相等,相等为真
!=
判断两个操作数是否不等,不等为真
>
判断左边的操作数是否大于右边的操作数,是为真
<
判断左边的操作数是否小于右边的操作数,是为真
>=
判断左边的操作数是否大于或者等于右边的操作数,是为真
<=
判断左边的操作数是否小于或者等于右边的操作数,是为真
位运算是将符号两边的操作数(有些符号只有一个操作数)化为二进制的形式,再按照符号的规则按位进行运算,运算之后将结果转化为十进制后输出。
&
操作数在左右两边 相对应位都为 1,则结果为 1,否则为 0
|
操作数在左右两边 相对应位都为 0,则结果为 0,否则为 1
^
操作数在左右两边 相对应位相同,则结果为 0,否则为 1
~
操作数在右边 将操作数相应位中 1 变为 0,0 变为 1
<<
操作数在左右两边 将左操作数按位左移右操作数(十进制)指定的位数
>>
操作数在左右两边 将左操作数按位右移右操作数(十进制)指定的位数
>>>
操作数在左右两边 将左操作数按位右移右操作数(十进制)指定的位数,移动得到的空位用 0 补齐。
&&
操作数两边都为真,则为真,否则为假
||
操作数两边都为假,则为假,否则为真
!
操作数为真,则为假;操作数为假,则为真
注意:&&
运算符在使用时,当第一个操作数的结果为 false,则直接判定结果为 false,即不会判断第二个操作数的值了(因为没必要了)。
=
将右操作数的值赋给左操作数
+=
把左操作数和右操作数相加赋值给左操作数
-=
把左操作数和右操作数相减赋值给左操作数
*=
把左操作数和右操作数相乘赋值给左操作数
/=
把左操作数和右操作数相除赋值给左操作数
%=
把左操作数和右操作数取模后赋值给左操作数
<< =
对操作数进行左移运算后赋值给左操作数
>> =
对操作数进行右移运算后赋值给左操作数
&=
对操作数进行按位与运算后赋值给左操作数
^=
对操作数进行按位异或运算后赋值给左操作数
|=
对操作数进行按位或运算后赋值给左操作数
条件运算符有3个操作数,属于三元运算符。
条件运算符的语法如下:
操作数1 ? 操作数2 : 操作数3
当操作数1
的值为true
时,执行操作数2
;当操作数1
的值为false
时,执行操作数3
。
作用:判断指定的对象是否是一个指定的类型(类、接口)。
注意:前者只能是对象,后者只能是类或接口。
语法:
对象名 instanceof 类名/接口名
通常也可以用于判断某个变量是否属于某一类基本类型。
public static void main(String[] arg){
int a = 13;
Object object = a;
System.out.println(object instanceof Integer);
}
既然 Java 中运算符这么多,那么当它们出现在一个表达式中时,我们应该按照什么顺序执行不同的运算符呢?以下就是规定好的运算符优先级,排的越高,最先运算;排的越低,最后运算。
注:
1、其中优先级为 2 的+和-
表示正负;优先级为 4 的+和-
表示加减;
2、.
的优先级为 1(如图),一般是表示包名、类名、方法名、变量名之间的分隔符号。如:Math.sin(3.3);
的点。
运算符以及它们的优先级,理解起来并不是很难,难是难在记忆和运用。熟练掌握需要花费一定时间去实践。下节讲循环语句。