前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素。不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”、“year<limit”、“year++”。第一个“year = 0”用来给该变量初始赋值,第二个“year<limit”则为是否退出循环的判断条件,第三个“year++”用于该变量的自增操作。这三处语句结合起来,方能实现循环的有限次数处理,而非无限次的运转。换句话说,要想实现一个标准的循环结构,就必须具备上述的三种基本操作。于是Java设计了新的for循环,意图让形态规整的for语句取代结构散乱的while语句。
for循环的书写格式形如“for (A; B; C;) { /* 这里是循环的内部代码 */ }”,其中式子A是初始化语句,在首次进入循环时执行;式子B是循环的判断条件,B成立时继续循环,不成立时退出循环;式子C一般是变量的自增或自减操作,在开始下一次循环之前执行。仍以前述的唤醒游戏为例,使用for语句改写后的循环代码如下所示:

		System.out.println("长夜漫漫,无心睡眠");
System.out.println("请给他设定一个睡醒的年限");
Scanner scan = new Scanner(System.in); // 从控制台接收输入文本
/* nextLine方法表示接收一行文字,以回车键结尾 */
int limit = scan.nextInt();
int year;
// for (A; B; C;)的三个式子A、B、C说明如下:
// 式子A在首次进入循环时执行;
// 式子B是循环的判断条件,B成立时继续循环,不成立时退出循环;
// 式子C在开始下一次循环之前执行。注意,每次循环结束之后,先执行式子C,再进行式子B的判断
for (year=0; year<limit; year++) {
System.out.println("已经过去的年份:"+year);
}
System.out.println("他足足睡了这么多年:"+year);

从以上代码可见,for循环把三种基本操作都放到了同一行,大大缩减了代码行数。仅仅三行for语句,等价于以下十几行的while循环代码:

		year = 0;
if (year<limit) {
while (true) {
System.out.println("已经过去的年份:"+year);
year++;
if (year<limit) {
continue;
} else {
break;
}
}
}

不过精简代码的代价是缺乏灵活性,由于for语句的条件判断默认在每次循环开始之前执行,倘若希望在循环内部的指定位置进行是否继续循环的判断,则仍然要把式子B的判断条件挪到循环里面,此时for语句原先给式子B的地方可以留空。于是挪动条件判断之后的for循环代码变成了下面这样:

		for (int year=0; ; year++) {
System.out.println("已经过去的年份:"+year);
if (year >= limit) { // 这里判断能否跳出循环
System.out.println("他足足睡了这么多年:"+year);
break; // 跳出循环。即跳到for循环的右花括号之后
} else {
continue; // 继续下一次循环。此时先执行year++,再执行循环内部语句
}
}

既然式子B原来的位置允许留空,那么只要处理得当,式子A和式子C的位置也是允许留空的。三个位置同时留空后的for循环代码示例如下:

		int year = 0; // 把式子A挪到整个循环的前面
for (; ; ) { // for语句后面的三个位置全部留空
System.out.println("已经过去的年份:"+year);
if (year >= limit) { // 这里判断能否跳出循环
System.out.println("他足足睡了这么多年:"+year);
break; // 跳出循环。即跳到for循环的右花括号之后
} else {
year++; // 把式子C挪到continue之前
continue; // 继续下一次循环。此时先执行year++,再执行循环内部语句
}
}

可是一旦紧跟for语句之后的三个位置全都留空,这个for就变得毫无特点了,此时的“for (; ; )”完全等价于“while (true)”。所以说,具体采取哪种循环形式,还得根据实际的业务要求来定夺。

Java开发笔记(十九)规律变化的for循环的更多相关文章

  1. Java开发笔记(九十一)IO流处理简单的数据压缩

    前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概.这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可 ...

  2. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  3. Java开发笔记(九)赋值运算符及其演化

    前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...

  4. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  5. Java开发学习(十九)----AOP环绕通知案例之密码数据兼容处理

    一.需求分析 需求: 对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理. 问题描述: 点击链接,会提示,请输入提取码,如下图所示 当我们从别人发给我们的内容中复制提取码的时候,有时候会多复制到一 ...

  6. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

  7. Java开发笔记(十三)利用关系运算符比较大小

    前面在<Java开发笔记(九)赋值运算符及其演化>中提到,Java编程中的等号“=”表示赋值操作,并非数学上的等式涵义.Java通过等式符号“==”表示左右两边相等,对应数学的等号“=”: ...

  8. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  9. Java开发笔记(八十九)缓存字节I/O流

    文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...

  10. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

随机推荐

  1. 自己封装element-ui树组件的过滤

    前言:vue开发项目时用到了element-ui的树组件,但是发现一执行过滤事件,树就全部都展开了,为了解决这个问题,只能自己先过滤数剧,再赋值给树组件的data,就避免了一上来全部展开的尴尬. 一. ...

  2. SQL Server数据库可能遇到的报错

    1.操作附加操作时报错: 可能的解决方法: 退出数据库,换Windows身份验证登录,就可以了 2.插入语句报错: 1) 2)

  3. 神经网络_线性神经网络 2 (Nerual Network_Linear Nerual Network 2)

    1 LMS 学习规则 1.1 LMS学习规则定义 MSE=(1/Q)*Σe2k=(1/Q)*Σ(tk-ak)2,k=1,2,...,Q 式中:Q是训练样本:t(k)是神经元的期望输出:a(k)是神经元 ...

  4. mysql5.7忽略大小写问题

    mysql5.7忽略大小写问题 1.1 前言 新安装mysql5.7版本后,linux环境下默认是大小写敏感的. 1.2 忽略大小写敏感步骤 进入mysql配置文件:         vi   /et ...

  5. truffle unbox react 出坑指南

    最近几天差点就被这鬼东西给逼疯了,truffle init .truffle unbox webpack 不管我怎么运行都是对的,唯独truffle unbox react 不管在哪个windows都 ...

  6. Go语言反射reflect

    目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...

  7. [Swift]LeetCode476. 数字的补数 | Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  8. [Swift]LeetCode481. 神奇字符串 | Magical String

    A magical string S consists of only '1' and '2' and obeys the following rules: The string S is magic ...

  9. [Swift]LeetCode963. 最小面积矩形 II | Minimum Area Rectangle II

    Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...

  10. dpkg: 处理软件包 xxx (--configure)时出错 解决办法

    第一步:备份 $ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk 第二步:新建 $ sudo mkdir /var/lib/dpkg/info 第三步 ...