一,运算符
(一)算术运算符: +、-、*、/、%、++、–。
(二)关系运算符: ==、 !=、 < 、>、 <=、 >=。
(三)逻辑运算符: &&、&、||、|、!、^
(四)位运算符: &,|,~,^,<<,>>,>>>
(五)条件运算符: 也叫三目运算符,只有一个:表达式1 ? 表达式2 : 表达式3
运算符优先级
Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。在同一个表达式中运算符优先级高的先执行。
级数 | 运算符 | 结合优先级顺序 |
---|---|---|
1 | ()、[] | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | «、»、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | 不短路或 | 从左向右 |
11 | && | 从左向右 |
12 | 或 | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、\=、^=、~=、«=、»=、>>>= | 从右向左 |
注:实际开发中,尽量使用()来控制表达式的执行顺序,代码可读性比运行效率往往更重要!
> 算术运算符
-
+:加法运算符
一种是跟数学中方法一样,另外,+还可以作为字符串的连接运算符。
-
-:减法运算符,*:乘法运算符
跟数学中方法一样 -
/:除法运算符
跟数学中方法一样
注:如果除法运算符的两个操作数都是整数类型,则计算结果为整数,除数不可以为0,否则会引发异常;如果除法运算符的两个操作数中至少一个是浮点数,则计算结果也是浮点数,此时除数可以为0或0.0,得到的结果是正无穷大或负无穷大。 -
%:求余运算符(取模运算符)
10%3=3
不仅仅可以对 int 求模,也能对 double 来求模。
11.5%2.0=5.75
- ++:自增运算符
需要注意的是前置(后置)自增/自减
前置自增/自减,如下
int a = 10;
int b = ++a;
输出:a=11 b=11
后置自增/自减,如下
int a = 10;
int b = a++;
输出: a=11 b=10
- 小结:
如果不取自增运算的表达式的返回值,则前置自增和后置自增没有区别。
如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值。
> 关系运算符:
- 关系运算符主要有六个==、 !=、 < 、>、 <=、 >=。
注意,Java中,关系运算符的表达式返回值都是boolean类型( true 或者 false )。这是与C语言有所不同的。
例如:
public static Test{
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);
}
> 逻辑运算符:
注意,逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean类型
- &&:规则:两个操作数都为 true,结果为 true,否则结果为 false 。**
- &:不短路与,作用与&&相同,但不会短路。**
- ||:或,两个操作数只要有一个为true,就返回true,两个操作数都为false才返回false。**
- |:不短路或,作用与||相同,但不会短路。**
- !:非,或取反,如果操作数是true,则返回false。如果是false,则返回true。**
- ^:异或,当两个操作数不同时才返回true,相同返回false。**
& 和 | (不推荐使用)
& 和 | 如果操作数为 boolean 的时候,也表示逻辑运算,但是和 && 以及 || 相比,它们不支持短路求值。
下面代码示范了逻辑运算符短路与不短路的区别(以|和||的区别为例):
int a = 3;
int b = 9;
if(a>2 | b++ >9){
//输出10,说明b++ >9得到了计算
System.out.println(b);
}
if(a>2 || b++ >9){
//输出9,说明b++ >9没有得到了计算
System.out.println(b);
}
&与&&的区别与此类似。
> 位运算符:
-
&:按位与。如果两个二进制位都是 1,则结果为 1,否则结果为 0 。**
-
|:按位或。如果两个二进制位都是 0,则结果为 0,否则结果为 1 ,只要有一位为1就返回1。**
结果如下:
其原因如下图所示:
-
~:按位非。单目运算符,将操作数的每一位(包括符号位)全部取反。
如果该位为 0 则转为 1,如果该位为 1 则转为 0 。
运行结果如下
分析如下图
注意:
0x 前缀的数字为 十六进制 数字。十六进制可以看成是二进制的简化表示方式。一个十六进制数字对应 4 个二进制位。
0xf 表示 10 进制的 15,也就是二进制的 1111。
printf 能够格式化输出内容,%x 表示按照十六进制输出。
\n 表示换行符。
-
^:按位异或。如果两个数字的二进制位相同,则结果为 0,相异则结果为 1。
运行结果如下
-
<<:左移运算符。最左侧位不要了,最右侧补 0 。**
-
.>>右移运算符。最右侧位不要了,最左侧补符号位(正数补0,负数补1)。**
-
. >>>:无符号右移运算符。最右侧位不要了, 最左侧补 0 。**
运行结果如下
原因如下
注意:
左移 1 位,相当于原数字×2。左移 N 位,相当于原数字×2 的N次方。
右移 1 位,相当于原数字÷2。右移 N 位,相当于原数字÷2 的N次方。
由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替。
移动负数位或者移位位数过大都没有意义。
代码示例如下:
System.out.println(5&9); //输出1
System.out.println(5|9); //输出13
System.out.println(~-5); //输出4
System.out.println(5^9); //输出12
System.out.println(5<<2); //输出20
System.out.println(-5<<2); //输出-20
System.out.println(-5>>2); //输出-2
//下面输出1073741822
System.out.println(-5>>>2);
> 条件运算符
当 表达式1 的值为 true 时,整个表达式的值为 表达式2 的值;当 表达式1 的值为 false 时,整个表达式的值为 表达式3 的值。
例如,两个数中的较大的数。
运行结果如下
这样,我们很轻松地就求取了两数中的较大值。
小结 % 操作再 Java 中也能针对 double 来计算。 需要区分清楚前置自增和后置自增之间的区别。 由于 Java
是强类型语言,因此对于类型检查较严格,因此像 && 之类的运算操作数必须是 boolean类型。 要区分清楚 & 和 |
什么时候是表示按位运算,什么时候表示逻辑运算。 整体来看,Java 的运算符的基本规则和 C 语言基本一致。
二:循环语句
- while循环
循环语句:可以让一部分代码反复执行
while循环: 编写格式:
while(条件){
循环体
}
条件:当条件为true,就执行循环体,执行完循环体后
程序再次执行while中的条件,如果条件还是true,继续执行循环体
知道条件是false的时候,循环结束
public class WhileDemo{
public static void main(String[] args){
//输出1-4之间的整数
//定义变量,整数类型,循环条件
int i = 1;
while(i<5){
System.out.println(i);
i++;
}
}
}
输出结果
- for循环
for循环
编写格式
for(初始化变量;条件;增量){
循环体
}
初始化变量:定义变量,作用,控制循环的次数
条件:当条件是true,执行循环体,条件是false,结束循环
增量:变量自增情况
public class ForDemo{
public static void main(String[] args){
//for循环,输出0-10
for(int i=0;i<=10;i++){
System.out.println(i);
}
}
}
输出结果
- dowhile循环
do while循环
编写格式:
do{
循环体
}while(条件);
特点:无条件先执行一次
public class DoWhileDemo{
public static void main(String[] args){
int i = 0;
do{
System.out.println(i);
i++;
}while(i<5);
}
}
输出结果
- 死循环
死循环后面的代码将不会被执行,编译时系统报错,因为Java不允许有代码不被执行
public static WhileForDemo{
public static void main(String[] args){
//while形式死循环
/*while(true){
}*/
//for形式死循环
for( ; ; ){
}
}
}
- 循环的嵌套
循环的嵌套:循环里面还有循环,for形式用的比较多
for(){
for(){
}
}
总的循环次数 = 内循环次数*外循环次数
内循环,是外循环的循环体
外循环,控制的是行数
内循环,控制的是每行的个数,即列数
public class ForForDemo{
public static void main(String[] args){
for(int i=0;i<9;i++){
for(int j=0;j<i+1;j++){
System.out.print("*");
}
System.out.println();
}
}
}
输出结果
*
**
***
****
*****
******
*******
********
*********