在java编程中,运算符是最基础,也是最需要熟练掌握的。
1. 按照运算符的优先顺序区分
2.按照运算符的种类进行区分
3.运算符的运用
1.算数运算符+,-,*,/,%,算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。
注意:在java中取余(%)运算符和C语言中是有区别的。在C语言中,取余运算符得到的一定是一个整数,
并且取余运算符的两端操作数必须是整数,而在java中两端操作数是数值类型就行,运算结果也可以是小数。
比如:在C语言中 int a=15,b=6;a=a%b ///则结果a=3;
如果是 float a=15.0,b=6.0; a=a%b; ///c编译器就会报错。
在java中 int a=15,b=6;a=a%b ///则结果a=3;
如果是 int a=15;float b=6.1 ; b=a%b; ///结果是b=2.8000002。这里是有一个浮点数精度误差。
2.自增自减运算符++,--。这个运算符是单目运算符,操作数可以放在左边X++,X--,也可以放在右边++X,--X,
但是表示的含义有所不同。
我的理解是:从结构来上,谁在前,就先使用谁进行运算。
比如:X++/X--,操作数X在前,就是先使用操作数X进行表达式的运算,使用之后,在对操作数X进行自增自减
++X/--X,运算符在前,就先对X进行自增自减,然后使用X进行表达式的运算。
1. int a=5;
int b=a++ + a++ +a++;
System.out.println(a); //a=8;
System.out.println(b); //b=18;
2. int a=5;
a=++a + a++;
System.out.println(a); //a=12;
3. int a=0;
for(int i=0;i<100;i++) {
a=a++;
}
System.out.println(a);//结果是a=0;
首先 a++ 是一个有返回值的表达式,返回值是a自加前的值,Java 对自加处理的流程是先把a的值(不是引用)
拷贝到一个临时变量区,然后对a变量加1,接着返回临时变量区的值。实际上就是把等号=右边的部分的运算结果保
存在临时变量区中,运算中间的部分,对应改变就可以了,然后用临时变量赋值。
3.按位运算符(&,|,^,~):Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100 B = 0000 1101 ----------------- A&b = 0000 1100 两个对应位都为1则为1,否则为0。 A | B = 0011 1101 两个对应位中有一个1则为1,否则为0。 A ^ B = 0011 0001 两个对应位不相同则为1,否则为0。 ~A= 1100 0011 把原来的数的补码全部取反。 注意:采用异或的方法,可以实现两个变量的替换,因为a==a^b^b; int a=3,b=5; a=a^b; b=a^b; a=a^b; (扩展) 可以采用加法的方法,实现两个变量的加法。 int a=3,b=5; a=a+b; b=a-b; a=a-b;
4.位移运算符(<<,>>,>>>):
java中有三种移位运算符;实际上位移运算是转化为int类型进行位移运算的。
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐,所以负数可能变成正数。
注意:当位移的位数是int类型的整数倍时,变量的值不变。
5.&和&&,|和||的区别。
单&和双&&(我习惯这样叫)都可以用作为逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果
都是true时,整个运算结果才是true,否则,只要有一方为false,则结果为false。
双&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式的,例子,对于if(!str=null&&!str.equals(""))表达式,当str为null时,后面的表达式不会执行,所以不会出现nullpointerexception,如果&&改
&,则会抛出nullpointerexception异常。