Java千问:Java循环语句的几个冷门知识点你都知道吗?

我们在进行Java开发的时候,经常会用到循环结构,但是有几个关于循环的“冷门”知识点,不知道你是不是都已经掌握了呢?我们一起来看看

一、大括号可以不写吗?

我们都知道,如果每次循环过程中要执行的语句只有一条,那么就可以不用写大括号。但事实真的如此吗?请看下面的代码:

大家可以看到,在循环中只有一条语句,但是并不能通过语法编译。这是为什么呢?因为Java语言规定:循环语句中重复执行的语句不能是一条单独的局部变量定义语句。这里所说的“定义局部变量语句”也可以指创建对象的语句,例如以下代码也不能通过编译:

同时,这个规律还可以延伸到条件语句,也就是说,if语句中也不能只有一条单独的局部变量定义语句,例如以下代码:

如果我们在以上三段代码中,给循环或条件语句都添加了大括号,语法错误自然就消失了:

二、如何定义多个循环变量?

我们平时定义的循环往往只有一个循环变量

例如在这个循环中,变量i就是一个循环变量。但是,如果开发过程中,需要我们在一个循环中定义并操作多个循环变量该怎么办呢?这时候,我们可以把多个循环变量的定义语句用逗号隔开,并且对循环变量的操作语句也用逗号隔开就可以了。我们以定义并操作两个循环变量为例作为示范,请看以下代码:

需要说明的是:for循环结构只能有两个分号(;),并且明确规定第一个分号前面的部分是用来定义并初始化循环变量的。我们知道,一个分号其实就表示一条语句的结束。所以说,第一个分号前面定义并初始化循环变量的语句只能有一条。既然只能有一条语句来定义循环变量,那么如果需要定义多个循环变量的话,这些循环变量只能同属一种类型,因为多种类型的循环变量必须要用多条语句来定义。如果实在需要定义多个类型不相同的循环变量,我们可以干脆在循环语句之前就把这些变量都定义好。

三、能否以浮点数作为循环变量?

我们通常都会把循环变量定义为整数类型,如果把循环变量定义为浮点数可以吗?我们来做个实验,请看以下代码

这段代码想必大家都能看懂,那么这段代码能否正常执行呢?答案是没问题,它的执行效果如下:

很多人通过这个实验就下定结论认为以浮点数作为循环变量没有什么问题,但是我们必须清楚:当一个浮点数大到一定程度的时候,就会导致精度的丢失,从而出现一些奇怪的错误。比如,我们把上面代码中start变量的初始值改成999999999;在这种情况下,重新运行程序,你会发现程序没有任何输出。为什么没有任何输出呢?变量f的初始值是start,而浮点数大到一定程度的时候,因为丢失了精度,会导致虚拟机错误的以为”f”与”start+5”的值是相同的,所以”f<start+5”并不成立,因此循环一次都不执行。
但是,如果我们把循环条件从” f<start+5”改成”f<start+50”,这个循环又会变成无限循环(死循环),为什么呢?就是因为, f的初始值很大,它会被保存为”1.0E9”。而执行了”f++”之后,由于精度的丢失,f的值仍然被保存为”1.0E9”,跟循环之前没有任何变化,所以循环条件总是成立的,因此循环才变成了死循环。
我们通过这个例子想告诉大家:如果没有十分的必要,不要使用浮点数作为循环变量,即使非要用浮点数充当循环变量,也一定要注意数值范围不能太大,否则会因为精度丢失而出现一些奇怪的现象。

四、内层循环如何控制外层循环?

我们都知道,在Java语言中,有两个能够控制循环执行的关键字,分别是break和continue。通常情况下,这两个关键字所控制的都是本层循环的执行,并不能控制到外层循环。但如果我们希望通过这两个关键字控制外层循环的执行,可以先给外层循环添加一个“标签”,通过在break或者是continue后面加标签,达到控制外层循环的目的。我们来看如下代码:

在这段代码中,我们给内外两层循环都加上了标签,分别叫做inner和outer。我们在内层循环中,当”j==4”的情况下执行continue语句,并且在continue的后面加上外层循环的标签outer,就能控制外层循环结束本次循环,直接进入下一次循环,因此循环代码执行过程中,不会在控制台上打印出”test”。其执行结果如下:

同理,我们如果把代码中才”continue”换成”break”,也能够在内层循环中直接跳出外层循环。
虽然从技术角度来说,Java语言能够实现在内层循环中控制外层循环,但是从程序设计的角度来讲,并不提倡这么做,因为我们更希望每一层循环“各司其职”,完成好自己的工作,如果需要从内层循环中直接中止外层循环的执行,可以设置一个局部变量,内层循环修改局部变量,而外层循环通过判断局部变量的值来决定是否结束本层循环,这样代码的结构性和可读性都会更好。

如果希望系统学习Java编程,可以点击链接https://edu.51cto.com/lecturer/2256836.html观看我在本站的视频课程。

原文地址:https://blog.51cto.com/2266836/2466201

时间: 2025-01-23 00:14:37

Java千问:Java循环语句的几个冷门知识点你都知道吗?的相关文章

Java千问:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!

我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符.复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步是赋值.比如说:上面的这两条语句相当于但是,如果碰到下面这样的情况,a的值该应该是多少呢?有人认为应该按以下方式来计算,因为我们都知道,在四则运算规则中,遵循"先乘除,后加减"的原则按照这样的方式来计算,得到a的值应该是7,但实际运行程序所得到的结果是8.这是为什么呢?就是因为复合赋值运算符在完成运算的时候,遵循一个规则:把&

《Java千问》系列短文写作计划

大家好,我在51CTO开博客啦!我本人从事软件开发和教学多年,在我从事教学过程中,回答过很多学生的问题,但非常遗憾,我只是当场回答了这些问题,但事后并没有把这些问题的解答写成博客.我打算弥补一下这个缺憾,因此产生了写文章解答问题的想法.经过几天酝酿,我打算把这些文章写成系列短文,名字就叫<Java千问系列>.取这个名字并不是说真的有一千个问题,"千"只是表示多的意思.只要我有把握回答的,都发表出来.关于<Java千问系列>的文章,在这里我想做几点说明:一.<

Java千问:Java语言中最大的整数再加1等于多少?

已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么?一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程序能够通过编译,但在运行时会抛出异常,但更多的人面对这道题目根本就无从下手.那么正确答案是什么呢?首先告诉大家,这段程序能够顺利通过编译,并且在运行时也不会出现异常,运行的结果是在控制台上输出了数字-2147483648!而-2147483648正好是Java语言中int类型所能表示的最小整数.这个运行结果可能会让很多人感到大跌眼镜,运行

Java千问:Java位运算经典应用(一)

很多人认为位运算在实际开发过程中并没什么用,学习位运算也只是为了应付面试.这种想法是错误的,接下来我们就通过几篇连载文章介绍一下位运算在实际开发过程中的几个经典应用实例.如果对位运算规则掌握还不是很熟练,可以先阅读<Java千问:Java语言位运算符详解>.这篇文章不仅详细讲解了Java位运算的基本规则和一些常用的运算定律,同时还在文中提到了一些常用的位运算实际应用,比如可以用位运算操作的方式快速把某个变量所在的内存单元清零,或者位运算的方式实现某个变量快速倍增等等.但文中所这提到的这几个实际

Java千问:Java位运算经典应用(二)

接上篇 三.不借助中间变量交换两个变量的值 通常情况下,我们要交换两个变量的值都按如下步骤操作: 这种操作方式不难理解,实现交换变量值的关键点就在于中间变量c.而现在的题目要求是不借助中间变量来交换a和b的值.如果不使用位运算的方式,同样可以做到不借助中间变量交换两个变量的值,其实现过程如下. 为了讲解方便,我们把最初a与b的值称之为原始a和原始b,3行代码就是3步操作:第1步:把原始a与原始b相加的和存储到变量a中,变量b的值暂时没有发生变化.第2步:用这个和减去原始b,再赋值到变量b中,经过

Java语言----三种循环语句的区别

------- android培训.java培训.期待与您交流! ---------- 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体; } eg: 1 class Dome_For2{ 2 public static void main(String[] args) { 3 //System.out.println("Hello World!"); 4 //求1-10的偶数的和 5 int sum = 0; 6 fo

【Java】switch+for循环语句+while循环+do...while循环+Random产生随机数

1. switch语句 1.1 switch语句结构(掌握) 格式 switch (表达式) {  case 1:  语句体1;  break;  case 2:  语句体2;  break;  ...  default:  语句体n+1;  break; } 执行流程: 首先计算出表达式的值 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束. 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉.

Java千问:你知道Java语言布尔型数据到底占多大空间吗?

我们都知道,Java语言中有个boolean类型.每个boolean类型的变量中存储的是一个true或者是false的逻辑值.那么存储这个逻辑值,需要多大的空间呢?从理论上来讲,存储这个逻辑值只需要1个位(bit)就可以了,很多教科书上谈到这个问题的时候,也说boolean类型的数据在内存中只占1个位. 但是稍微有点计算机常识的人都知道:计算机完成寻址操作的时候,是以字节为最小单位进行的.也就是说每次要读取内存中数据的时候,最小只能精确到1个字节,不能单独读取某个位上的信息.如果boolean类

JAVA基础语法1(循环语句)

1:switch语句的格式: q'wea's'd        Switch语句:选择结构语句                      格式:                    switch(表达式){                    case 值1:                        语句1;                        break;                    case 值2:                        语句2;