2.1 算术运算符
基本四则运算符 + - * / %
规则比较简单,值得注意的是除法:
a)int / int 结果还是int,需要使用double来计算。
int a = 1;
int b = 2;
System.out.println(a/b);
//结果为0
b) 0不能作为除数
int a =1;
int b =0;
System.out.println(a/b)
//运行结果
Exception in thread "main"java.long .ArithmeticException : / by zero
at Test.main(Test.java:5)
c) %表示取余,不仅仅可以对int求模,也能对double来求模
System.out.println(11.5%2.0);
//运行结果
1.5
增量赋值运算符 += -= *= /= %=
int a = 10;
a+=1; //等价于 a=a+1
System.out.println(a);
自增/自减运算符 ++ --
int a =10;
int b =++a;
System.out.println(b);
int c = a++;
System.out.println(c);
结论:
1.如果不取自增运算的表达式的返回值,则前置自增和后增没有区别。
2.如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值。
2.2关系运算符
== != < > <= >=
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
注意:关系运算符的表达式返回值都是booean类型。
2.3逻辑运算符
逻辑运算符主要有三个:
&& || !
注意:逻辑运算符的操作数和返回值都是boolean
逻辑与 &&
规则:两个操作数都是为true,结果为true,否则为false
int a = 10;
int b = 20;
int c = 30;
System.out.println(a<b && b<c);
逻辑或||
规则:两个操作数都为false,结果为false,否则为true
int a = 10;
int b = 20;
int c = 30;
System.out.println(a<b || b<c)
逻辑非!
规则:操作数为true,结果为false;操作数为false,结果为true(这个是单目运算符,只有一个操作数)。
int a = 10;
int b = 20;
System.out.println(!a<b);
短路求值
&&和||遵守短路求值的规则。
System.out.println(10>20&&10/0==0); //打印false
System.out.println(10<20||10/0==0); //打印true
我们都知道,计算10/0会导致程序抛出异常。但是上面的代码却能正常运行,说过10/0并没有真正被求值。
结论:
1.对于&&,如果左侧表达式值为false,则表达式的整体的值一定是false,无需计算右侧表达式。
2.对于||,如果左侧表达式值为true,则表达式的整体的值一定是true,无需计算右侧表达式。
&和|
&和|如果操作数为boolean的时候,也表示逻辑运算。但是和&&以及||相比,它们不支持短路求值
System.out.println(10>20&10/0==0);
System.out.println(10<20|10/0==0);
2.4 位运算符
java中对数据的操作的最小单位不是字节,而二进制位
位运算符主要有四个:
& | ~ ^
位操作表示按二进制位运算。计算机中都是使用二进制来表示数据的,按位运算就是在二进制位的每一位依次进行计算。
按位与&:如果两个二进制位都是1,则结果为1,否则结果为0
int a = 10;
int b = 20;
System.out.println(a&b);
进行按位运算,需要先把10和20转化成二进制,分别为1010和10100
按位或 | :如果两个二进制都是0 ,则结果为0,否则结果为1
int a = 10;
int b = 20;
System.out.println(a|b);
运算方式和按位于类似
注意:当&和7|的操作数位整数(int,short,long,byte)的时候,表示按位运算,当操作数位boolean的时候,表示逻辑运算。
按位取反~:如果该位为,则转为1,如果为0,则转为0
int a = 0xf;
System.out.printf("%x\n",~a);
注意:
1.0x前缀的数字为 十六进制可以看成是二进制的简化表示方式。一个十六进制数字对应4个二进制位。
2.0xf表示10进制的15,也就是二进制的1111。
3.printf能够格式化输出内容,%表示按照十六进制输出。
4.\n表示换行符。
按位异或^:如果两个数字的二进制位相同,则结果为0,则结果为1。
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n",a^b);
2.5 移位运算
移位运算符有三个:
<< >> >>>
都是按照二进制位来运算
左移<<:最左侧位不要了,最右侧补0
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20
右移>>:最右侧位不要了,最左侧补符号位
int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8
int b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000
无符号位右移>>>:最右侧位不要了,最左侧补0.
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff
注意:
1.左移1位,相当于原数字*2,左移N位,相当于原数字*2的N次方。
2.右移1位,相当于原数字/2,右移N位,相当于原数字/2的N次方。
3.由于计算机计算移位效率高于计算乘除,当某个代码正好乘除2的N次方的时候可以用移位运算代替。
4.移动负数或者移位位数过大没有意义。
2.6 条件运算符
条件运算符只有一个:
表达式1?表达式2:表达式3
当表达式的值为true时,整个表达式的值;当表达式1的值为false时,整个表达式的值为表达式3的值。
也是java中唯一的一个三目运算符,是条件判断语句的简化写法。
//求两个整数的最大值
int a = 10;
int b = 20;
int max = a>b?a:b;
2.7运算符的优先级
先看一段代码
System.out.println(1+2*3);
结果为7,说明先计算2*3,再计算1+
另外一个例子
System.out.println(10<20&&20<<30);
此时明显是先计算的10<20和20<30,再计算&&,否则20&&20这样的操作是语法上有误的(&&的操作数只能是boolean).
运算符之间是有优先级的,具体规则我们不必记忆,在可能时加上括号即可。
2.8小结
1.%操作再java中也能针对double来计算。
2.需要区分清楚 前置自增 和 后置自增 之间的区别。
3.由于java是强类型语言,因此对于类型检查比较严格,因此像&&之类的运算操作数必须是boolean。
4.要区分清楚&和|什么时候表示按位运算,因此像&&之类的运算操作数必须是boolean。
整体来看,java的运算符的基本规则和C语言基本一致。
3.注释
注释是为了让代码更容易被读懂而附加的描述信息,不参与编译运行,但是却非常重要。
3.1 基本规则
java中的注释主要分为一下三种
单行注释://注释内容(用的最多)
多行注释:/*注释内容*/
文档注释:/**文档注释*/
3.2注释规范
4.关键字