Java 有三种循环:for,while,do while。
for
基本语法:
for (循环变量初始化; 循环条件; 循环变量迭代){循环语句;
}
程序示例:
public static void main(String[] args) {for (int i = 0, j = 0; i < 3; i++, j--) {System.out.println("Hello World");}
}
循环变量初始化可以定义多个变量,循环变量迭代可以有多个。
程序示例:
// 需求:从键盘录入两个数字,表示一个范围,统计这个范围中,既能被 3 整除,又能被 5 整除的数字有多少个?import java.util.Scanner;public class test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入第一个整数:");int num1 = sc.nextInt();System.out.print("请输入第二个整数:");int num2 = sc.nextInt();int min = num1 < num2 ? num1 : num2;int max = num1 > num2 ? num1 : num2;int count = 0;for (int i = min; i <= max; i++) {if (i % 3 == 0 && i % 5 == 0)++count;}System.out.print("从" + min + "到" + max + "既能被3整除又能被5整除的数字有" + count + "个。");}
}
执行结果 1:
请输入第一个整数:1
请输入第二个整数:20
从1到20既能被3整除又能被5整除的数字有1个。
执行结果 2:
请输入第一个整数:20
请输入第二个整数:1
从1到20既能被3整除又能被5整除的数字有1个。
错误程序示例 1:
public static void main(String[] args) {int i = 9;for (int i = 0, j = 0; i < 3; i++, j--) { // 已在方法 main(java.lang.String[]) 中定义了变量 iSystem.out.println("Hello World");}
}
错误程序示例 2:
public static void main(String[] args) {for (int i = 0, j = 0; i < 3; i++, j--) {int i = 9; // 已在方法 main(java.lang.String[]) 中定义了变量 iSystem.out.println("Hello World");}
}
错误程序示例 3:
public static void main(String[] args) {int i = 9;for (int a = 0, j = 0; a < 3; i++, j--) {int i = 9; // 已在方法 main(java.lang.String[])中定义了变量 iSystem.out.println("Hello World");}
}
都会报错:已在方法 main(java.lang.String[]) 中定义了变量 i
。
//正确
public static void main(String[] args) {for (int i = 0, j = 0; i < 3; i++, j--) {System.out.println("Hello World");}for (int i = 0, j = 0; i < 3; i++, j--) {System.out.println("Hello World");}
}
主 scope 和子 scope 不能重复定义,两个子 scope 可重复定义。
循环条件返回一个 boolean 值。
for 循环头的三个表达式都可以省略,但是分号不能省略,省略循环条件表示一直为真。
快速书写 for 循环的方法:
先输入 50.fori
,然后回车:
自动生成了一个 for 循环,起始为 0,终止为 50,循环变量是自动的,且会保证不会发生作用域冲突:
while
基本语法:
循环变量初始化;
while (循环条件){循环体;循环变量迭代;
}
while 循环也有四个要素,只是放置的位置不一样。
练习:
// 需求:世界最高山峰是珠穆朗玛峰(8844.43 米 = 8844430 毫米),
// 假如我有一张足够大的纸,它的厚度是 0.1 毫米。
// 请问,我折叠多少次,可以折成珠穆朗玛峰的高度?public static void main(String[] args) {int HEIGHT = 8844430;double init = 0.1;int count = 0;while (init <= HEIGHT) {init *= 2;++count;}System.out.println(init);System.out.println(count);
}
执行结果:
1.34217728E7
27
练习:
// 回文数:
// 需求:给你一个整数 x。
// 如果 x 是一个回文整数,打印 true,否则,返回 false。
// 解释:回文数是指正序(从左向右)和倒序(从右向左)读都是是一样的整数。
// 例如,121 是回文,而 123 不是。import java.util.Scanner;public class whileTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入一个整数:");int n = sc.nextInt();int tmp = n;int num = 0;while (tmp != 0) {int get = tmp % 10;tmp /= 10;num = num * 10 + get;}System.out.println(n == num);}
}
执行结果:
请输入一个整数:121
true
练习:
// 需求:给定两个整数,被除数和除数(都是正数,且不超过 int 的范围)。
// 将两数相除,要求不使用乘法、除法和 % 运算符。
// 得到商和余数。import java.util.Scanner;public class whileTest2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入被除数:");int dividend = sc.nextInt();System.out.print("请输入除数:");int divisor = sc.nextInt();int count = 0;while (dividend >= divisor) {dividend -= divisor;++count;}System.out.println("商为" + count + ",余数为" + dividend);}
}
执行结果:
请输入被除数:13
请输入除数:3
商为4,余数为1
循环条件返回一个 boolean 值。
程序示例:
public class While {public static void main(String[] args) {int i = 0;while (i) {System.out.println("Hello");}}
}
报错: 不兼容的类型: int 无法转换为 boolean
for 和 while 的对比:
相同点:运行规则都是一样的。
区别:for 循环中,循环控制变量归属于 for 循环的语法结构中,在 for 循环结束后,就不能再次被访问了。while 循环中,循环控制变量不归属于 while,在 while 循环结束之后,该变量还可以继续使用。如果 for 循环的循环控制变量在 for 前面定义,而不是在 for 循环头中定义,则当 for 结束了该变量依旧可以使用。
能用 for 的地方一定能用 while 进行改写,能用 while 的地方一定能用 for 进行改写。
一般如果知道循环次数或者循环范围,就用 for,否则用 while。无限循环是不知道循环次数的,因此无限循环一般都使用 while。
do while
基本语法:
循环变量初始化;
do{循环体;循环变量迭代;
}while (循环条件);
do while
是关键字。
也有四要素,只是位置不一样。
循环条件返回一个 boolean 值。