目录
1. 顺序
2. 分支
2.1 if语句
2.1.1 单一条件的if语句
2.1.2 if-else语句
2.1.3 多层if-else语句
2.2 switch语句
3. 循环
3.1 for循环
3.2 while循环
3.3 do-while循环
3.4 break和continue
语序即代码运行的顺序,主要分为三种,顺序、分支和循环。
顺序结构是一种最基本的程序控制结构,指的是程序中的代码按照从上到下的顺序依次执行。所有的代码行都会被逐行执行,除非遇到控制结构(如条件判断或循环)改变了这一顺序。常用于简单的任务,如变量声明、赋值、算术操作、输入输出等基本操作。
例如自我介绍
public class DemoNew {
public static void main(String[] args){
System.out.println("大家好");
System.out.println("我的名字叫xxx");
System.out.println("来自xxx");
}
}
结果为连续的三句话
分支主要用到if和switch语句,根据特定条件执行不同的代码块。
这种形式用于在某个条件为真时执行某个代码块。如果条件为假,则跳过该代码块。
格式为
if(条件){
//条件为真时执行的代码
}
例如
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数字:");
int num=sc.nextInt();
//判断数字是否大于2
if(num>2){//数字大于2则为true,if执行括号内的内容,否则跳过if语句
System.out.println("数字大于2");
}
System.out.println("判断结束");
}
}
结果为
但是实际运用中,一般可能需要几种情况,我们可以用多个if语句。
这种形式在条件为真时执行一个代码块,为假时执行另一个代码块。
格式为
if (条件) {
// 当条件为真时执行的代码
} else {
// 当条件为假时执行的代码
}
这里要注意的是if和else的代码块肯定有一个一定要执行,毕竟条件要么为true,要么为false。
我们对上面代码改良
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数字:");
int num=sc.nextInt();
//判断数字是否大于2
if(num>2){//数字大于2则为true,if执行括号内的内容
System.out.println("数字大于2");
}else{//否则为false,执行else括号里的内容
System.out.println("数字小于等于2");
}
}
}
这种形式用于检查多个条件。每个条件依次检查(顺序),如果某个条件为真,则执行对应的代码块,并跳过后续的检查。如果所有条件都为假,则执行else代码块。
if (条件1) {
// 当条件1为真时执行的代码
} else if (条件2) {
// 当条件2为真时执行的代码
} else {
// 当所有条件都为假时执行的代码
}
我们举一个例子(要求输入1-5内的任意一个整数,输出其大写形式) :
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数字:");
int num=sc.nextInt();
if(num==1){
System.out.println("一");
}else if(num==2){
System.out.println("二");
}else if(num==3){
System.out.println("三");
}else if(num==4){
System.out.println("四");
}else if(num==5){
System.out.println("五");
}else{//输入的不属于1-5之间的任意一个整数
System.out.println("输入不合法");
}
}
}
当输入为1、2、3、4、5,都会打印出对应的大写形式,否则就会输出"输入不合法"。但是这样的话,if-else语句太多了。
switch语句用于执行多分支选择的控制结构,适用于基于单个变量的多重条件判断。
switch (表达式) {//表达式必须是一个可计算为整数、字符串、枚举、字符等类型的值
case 情况1://情况用于和表达式的值进行比较,只有相同才能执行情况1所对应的代码
// 当表达式等于 value1 时执行的代码
break;/*用于跳出switch语句,如果省略,则将一直往下进行,直到运行下一个break或 者到switch的右大括号*/
case 情况2:
// 当表达式等于 value2 时执行的代码
break;
// 可以有多个 case 子句
default://default子句是可选的,当上述情况都不符合,就会执行default子句当中的代码
// 当表达式不等于任何一个 case 的值时执行的代码
}
我们将2.1.3涉及到的代码用switch进行重写,如下:
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数字:");
int num=sc.nextInt();
switch(num){
case 1:
System.out.println("一");
break;
case 2:
System.out.println("二");
break;
case 3:
System.out.println("三");
break;
case 4:
System.out.println("四");
break;
case 5:
System.out.println("五");
break;
default:
System.out.println("输入不合法");
}
}
}
为了让大家了解break的用处,提出一个新的问题。(假设我们有一个程序需要判断某天是工作日还是周末,并输出相应的消息。周一到周五都是工作日,而周六和周日是周末。)
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入星期几:");
int day=sc.nextInt();
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("今天是工作日");
break;
case 6:
case 7:
System.out.println("今天是周末");
break;
default:
System.out.println("输入无效");
break;
}
}
}
无论输入1-5之间的哪个数字,都会打印出‘今天是工作日’,因为代码共享。这个代码还可以改良,利用case后可以放多个值的特性。
import java.util.Scanner;
public class DemoNew {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入星期几:");
int day=sc.nextInt();
switch (day) {
case 1,2,3,4,5:
System.out.println("今天是工作日");
break;
case 6,7:
System.out.println("今天是周末");
break;
default:
System.out.println("输入无效");
break;
}
}
}
但是关于switch有很多注意事项
1.每个case的值必须是唯一的常量表达式,不能是变量或动态计算的值。
2.如果没有break,则会发生“贯穿”,执行下一个case的代码。因此,如果你不需要“贯穿”,务必在每个case后使用break。
3.default虽然是可选的,但强烈建议使用,以便处理任何未匹配的情况。
4.swtich只适合确定的离散值选择,当涉及到范围时,if-else更适合。
在最新版的switch中,增加了几个功能。
1.case语法变为case
值->表达式
且默认自带break;例如case 1-> System.out.println("今天是工作日");
2.
表达式形式的switch允许你将swtich的结果赋值给一个变量,但switch里面的case返回的得是常量,且和变量的类型相同。例如
String dayName = switch (day) { case 1 -> "Monday"; case 2 -> "Tuesday"; case 3 -> "Wednesday"; case 4 -> "Thursday"; case 5 -> "Friday"; case 6 -> "Saturday"; case 7 -> "Sunday"; default -> "Invalid day"; }; System.out.println(dayName);
3.yield可以返回值。
String dayName = switch (day) { case 1 -> "Monday"; case 2 -> "Tuesday"; case 3 -> { System.out.println("Midweek day"); yield "Wednesday"; } case 4 -> "Thursday"; case 5 -> "Friday"; case 6 -> "Saturday"; case 7 -> "Sunday"; default -> { System.out.println("Invalid day"); yield "Unknown"; } };
循环允许在满足特定条件的情况下重复执行一段代码。
格式为
for (初始化语句; 循环条件表达式; 更新语句) {
// 循环体代码
}
初始化语句:在循环开始时执行一次。通常用于声明和初始化循环变量。
循环条件表达式:每执行一次循环就判断一次,如果是true,则继续循环,否则就跳出for循环。
更新语句:用来更新初始化的变量,防止一直循环,每执行一次for循环,变量就更新一次。
例如按顺序输出1-5之间的整数:
public class DemoNew {
public static void main(String[] args){
for(int i=1;i<=5;i++){
System.out.println(i);
}
}
}
共执行5次,i从1到5,当运行到第六次时,i>5,为false,跳出for循环。
此外在for循环里定义的变量,离开for循环后变得没有意义。
while循环在每次迭代之前检查条件表达式的结果,并在条件为true时执行循环体内的代码。
while (循环条件表达式) {
// 循环体代码
}
循环条件表达式:每次循环开始前进行判断。如果条件为true,则执行循环体代码;如果条件为false,则退出循环。
和for循环的区别就在于,当面临不知道要运行多少次而只知道最后要满足什么条件时,while循环更适合。
例如上面那个例子可以改写为:
public class DemoNew {
public static void main(String[] args){
int i=1;
while(i<=5)
System.out.println(i);
i++;
}
}
}
值得注意的是while的循环条件表达式里面的变量的值要更新,防止陷入死循环,更新过程在while中,且在while循环之前定义,不然无法使用。
和while循环有一点区别,do-while循环在执行循环体代码之前不会检查条件,而是在每次循环之后检查条件,即至少运行一次。
格式为:
do {
// 循环体代码
} while (循环条件表达式);
适合于那些需要确保至少进行一次操作的场景,总体不太实用。
break用于立即退出当前循环(包括for、while 和do-while循环)或switch语句。它会跳出循环体并继续执行循环后的代码。break语句可以用来提前结束循环,通常用于满足某个特定条件时停止循环。
例如输出1-10之间的数字,但是遇到5就退出循环:
public class DemoNew {
public static void main(String[] args){
int i=1;
while(i<=10){
if(i==5) {
break;
}
System.out.println(i);
i++;
}
}
}
其实if里的条件表达式可以加入到while中。
continue用于跳过当前循环中的剩余代码,并开始下一次循环迭代。continue语句不会退出循环,而是直接跳过当前迭代剩余的部分,回到循环条件判断部分。不能用于switch部分。
例如输出1-10之间的数字,但不输出3的倍数:
public class DemoNew {
public static void main(String[] args){
int i=1;
while(i<=10){
if(i%3==0) {//是3的倍数就跳出本轮循环,但还是要更新数据
i++;
continue;
}
else{
System.out.println(i);
i++;
}
}
}
}
此外break和continue都只能退出最内层的循环。