运算符-表达式-分支语句-循环语句

运算符-表达式-分支语句-循环语句

【摘要】运算符、表达式、分支语句、循环语句

前言

说句实话,按照道理说我应该对这一部分很熟悉,毕竟大学考前突击了好几个夜晚。但是,哈哈哈哈。特别的位运算那边,想不起来,故查阅自己当时学习的笔记和现在的理解整理出此文~

运算符

赋值运算符

=
左值,出现在赋值运算符左边的量【局部变量、常量】
右值,出现在赋值运算符右边的量【局部变量、常量、字面量】

算术运算符

+,-,*,/,%,++,--,+=,-=,*=,/=,%=

针对++和——运算符,它分为: 操作
前++,变量本身和表达式的值都增1.
后++,表达式的值不变,变量本身的值增1.
Java基本数据类型中,除了boolean不能做算术运算外,其它的7种类型都可以进行算术运算,它们遵守如下两条规则:
A.byte,short,char,int之间的运算,结果总是int
B.除A外规则,其他的按照从小到大的原则进行转换,如下:byte,short,int ->long ->float ->double

比较运算符

>,<,>=,<=,==,!=
比较运算符的结果一定是boolean值,如:

1
boolean b = 5 > 3;

逻辑运算符

运算符 说明
&& 逻辑与,两边同时成立,结果才成立。
|| 逻辑或,两边同时不成立,结果才不成立。
! 真为假,假为真

注:逻辑运算符要求它的操作数必须是boolean类型。
如:boolean b = (5 > 3) && (5 % 3 == 0);
&&|| 短路运算符

三目运算符

?:
语法:
expr1?exper2:exper3;
expr1成立时,则执行并返回expr2,否则,执行并返回exper3

如:

1
2
int i = 19;
String str = (i % 2 == 0) ? "偶数" : "奇数";

位运算符

基本概念

运算符 说明
& 按位与,两边为1,结果为1,有一边为0,结果为0。
按位或,两边为0,结果为0,有一边为1,结果为1。
^ 按位异或,相同为0,不同为1。
~ 按位取反,0位1,1为0。
>> 右移位,高位补符号位。
>>> 无符号右移位,高位总是补0。
<< 左移位

&=,|=,^=,~=,>>=,>>>=,<<=

1
2


以整数为例,如:

二进制转十进制,乘幂相加法。

十进制转二进制,除2取余,直到商为0。

二进制 十进制
10 2
11 3
10110 22
101111011 187

注:在Java中,支持二、八、十、十六进制的字面量,默认下,整数都是以十进制表达的。

1
2
3
4
5
6
7
8
//如果你想用二进制表达整数,则需要以0b开头。
int i = 0b1011101;//ok

//如果你想用八进制表达整数,则需要以0开头。
int i = 015;//ok,相当于十进制13

//如果你想用十六进制表达整数,则需要以0x开头。
int i = 0x1F;//ok,相当于十进制的31

求负数的二进制方法:
1).先算 这个负数 绝对值 减1的 二进制。
2).按位取反:1111111111… 011 => 共计32位。

位运算口诀

清0取位要用与,某位置1可用或,
若要取反和交换,轻轻松松用异或。

这个口诀中,关键要找到掩码[mask]

比如:
1.判断一个整数的奇偶性。

1
2
3
4
5
//定义掩码:
int mask = 0x1;//00000...0001
int i = ...;
//判断
String iStr = (i & mask) == 0"偶数" : "奇数";

2.高24位不变,低8位取反

1
2
3
4
5
6
7
8
9
10
11
//定义掩码:
int mask = 0xFF;
int i = ...;
//判断
String iStr = mask ^ i;
//中间8位取反
//定义掩码:
int mask = 0xFF000;
int i = ...;
//判断
String iStr = mask ^ i;

3.一个整数连续异或另一个整数两次,其值不变。(最简单的加密)
如:

1
2
3
4
5
6
7
int a = 18;//10010
int b = 21;//10101
//a ^ b ^ b 的结果将会还是 a
//交换a和b:
a = a ^ b;//a = a ^ b;
b = a ^ b;//b = b ^ a ^ b;//相当于a异或了b两次,回到b
a = a ^ b;//a = a ^ b ^ a;//相当于b异或了a两次,回到a

表达式[expression]

概念:由变量、常量、字面量与运算符组合成的合法语句。
如:

1
2
int i = 9;//变量定义,也是 赋值表达式
int j = i * 2 + 1;

分支语句

if语句

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(条件表达式){
//代码块
}
//或:
if(条件表达式){
//代码块1
}
else{
//代码块2
}
//或:
if(条件表达式){
//代码块1
}if else(条件2){
//代码块2
}if else(条件3){
//代码块3
}else{
//其他代码块...
}

举个栗子,如:

1
2
3
4
5
6
int i = 9;
if((i & 1) == 0){
System.out.println(i+" 是一个偶数.");
}else{
System.out.println(i+" 是一个奇数.");
}

牛刀小试,请根据如下要求编写一个程序。
1.从键盘输入学员的成绩,根据成绩打印出相依的等级,成绩和等级的关系是:

成绩 等级
>= 95 A+
[90,95) A
[80,90) B
[70,80) C
[60,70) D
<60 E

点击进入答案解析

switch语句

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(变量因子){
case1
//代码块;
[break;]
case2
//代码块;
[break;]
...
case 值N:
//代码块;
[break;]
default:
//默认代码块;
[break;]
}

注:变量因子的数据类型只能是:byte,short,char,int,枚举,Sting
举个栗子,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int i = ...;
switch(i){
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
case 3:
System.out.println("3");
break;
case 4:
System.out.println("4");
break;
default:
System.out.println("other");
}

牛刀小试,请根据如下要求编写一个程序。
1.提示用户从键盘上输入年份和月份,然后判断此年月最大有多少天。
点击进入答案解析

循环语句

for循环

语法:

1
for(expr1;exper2;exper3){}

注:事先已经明确循环次数的场景下可以使用for循环。循环都可以嵌套。

举个栗子,如:

1
2
3
4
//使用for循环来循环5次。
for(int i = 0; i<5;i++){

}

牛刀小试,请根据如下要求编写一个程序。
1.打印输出一个99法则表。
点击进入答案解析

while循环

语法:

1
2
3
while(条件表达式){
//循环体
}

比如,使用while循环5次

1
2
3
4
5
int i = 0;
while(i<5){
System.out.println("haha");
i++;
}

注:
如果事先不知道循环次数,可以使用while语法。
如果事先明确知道循环次数,则建议使用for语法。

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(true){
System.out.println("haha");
//
if(满足某个条件){
break;//打破循环
}
}
//或:【不适用break】
boolean exit = false;
while(!exit){
System.out.println("haha");
//
if(满足某个条件){
exit = true;//修改变量的值
}
}

案例:
随机生成1~100之间的随机整数,当生成的随机数恰好是你事先指定的一个整数时,
则此程序退出,并打印输出循环次数。
思考:在java中,如何生成随机数?

1
2
3
4
5
6
7
方法一:利用java.util.Random类
//Code
Random r = new Random();
int i = r.nextInt(100) + 1;
方法二:利用java.lang.Math类
//
int i = (int)(Math.random()*100)+1;

do while循环

语法:

1
2
3
do{
//循环体
}while(条件表达式);

它是一个先执行循环体而后做条件判断的循环。
如:

1
2
3
4
5
int i = 0;
do{
System.out.println("haha");
i++
}while(i<5);

break和continue语句

break语句,用来打破循环。
continue语句也是一样只能用在循环中,它是结束本轮循环,开始下一轮循环。

注:
不管是break还是continue语句,它们影响的都是最接近于自己那一层循环。

如:

1
2
3
4
5
6
for(int i = 0;i<9;i++){
if(i%3 == 0){
break;
}
System.out.println("haha");
}

习题

打印形状

1.编写一个程序,打印如下形状:[高度由用户输入]

1
2
3
4
5
*
**
***
****
*****

2.打印形状[高度由用户输入]

1
2
3
4
   *
***
*****
*******

3.打印形状[高度由用户输入]

1
2
3
4
5
6
7
8
9
    *			 	
* *
* *
* *
* *
* *
* *
* *
*

点击进入答案解析

打印数字

1.输出打印如下数字

1
2
3
4
5
1*1=1 
11*11=121
111*111=12321
...
1111111*111111=12345654321

2.输出如下数字

1
2
3
4
5
1*8+1=9
12*8+2=98
123*8+3=987
...
123456789*8+9=987654321

点击进入答案解析

算法题

1.根据用户输入的整数,计算出此数的阶乘
5! = 5*4*3*2*1

2.找出1000以内的所有水仙花数
水仙花数是指一个N位正整数(N>=3),它刚好是它每一个数的n次幂之和。
如:153=1^3+5^3+3^3

3.找出200以内所有的质数,并打印出来,要求:每行最多输出10个。
点击进入答案解析

结束语

上面这些习题是我曾经做过的题目,这些题目很基础,不要动脑子,适合初学者。但是呢,一旦我去LeetCode上面刷题,我就怀念这些基础题,哈哈哈哈。
所以,现在先在这篇文章贴出来,等哪天被LeetCode虐了,再来这边找找存在感,后续贴源码链接。

评论