首先需要说明的是,以下问题都是出自《Java解惑》,这里做一个整理,也加深一下印象。
下面所有的问题都是给出一个循环,给它加一个什么样的变量声明,使它作用于循环上时能够使循环无限循环下去(即变成一个无限循环)。
1.
for (int i = start; i <= start + 1; i++) {}
这个问题还比较简单,只需要这样声明即可(注意:上面的是小于等于号):int start = Integer.MAX_VALUE - 1;
2.
While (i == i + 1) {}
如果 i 在循环开始之前被初始化为无穷大,无穷大加 1 还是无穷大,那么终止条件测试(i == i + 1)就会被计算为 true,从而使循环永远都不会终止。这样声明即可:double i = Double.POSITIVE_INFINITY;
事实上,任何足够大的浮点数都可以实现这一目的,例如: double i = 1.0e40; 这样做之所以可以起作用,是因为一个浮点数值越大,它和其后继数值之间的间隔就越大。浮点数的这种分布是用固定数量的有效位来表示它们的必然结果。对一个足够大的浮点数加 1 不会改变它的值,因为 1 是不足以“填补它与其后继者之间的空隙”。
3.
while (i != i) { }
IEEE 754 浮点算术保留了一个特殊的值用来表示一个不是数字的数量,这个值就是 NaN(“不是一个数字(Not a Number)”的缩写),对于所有没有良好的数字定义的浮点计算,例如 0.0/0.0,其值都是它。规范中描述道,NaN 不等于任何浮点数值,包括它自身在内。因此,如果 i 在循环开始之前被初始化为 NaN,那么终止条件测试(i != i)的计算结果就是 true,循环就永远不会终止。很奇怪但却是事实。 可以这样声明:double i = 0.0 / 0.0;
为了表达清晰,可以使用标准类库提供的常量: double i = Double.NaN;
4.
while (i != i + 0) { }
注意:此题不使用浮点数。
我们必然可以得出这样的结论,即 i 的类型必须是非数值类型的,并且这其中存在着解谜方案。唯一的 + 操作符有定义的非数值类型就是 String。+ 操作符被重载了:对于 String 类型,它执行的不是加法而是字符串连接。如果在连接中
的某个操作数具有非 String 的类型,那么这个操作书就会在连接之前转换成字符串。
事实上,i 可以被初始化为任何值,只要它是 String 类型的即可,例如:String i = "Hello";
5.
while (i <= j && j <= i && i != j) { }
在Java5.0版本及以后,<=操作符在原始数字类型集上是反对称的,但是<=操作符在被包装的数字类型(Byte、Character、Short、Integer、Long、Float 和 Double)的操作数上不是反对称的,因为 Java 的判等操作符(==和!=)在作用于对象引用时,执行的是引用ID 的比较,而不是值的比较。
所以这样声明即可: Integer i = new Integer(0); Integer j = new Integer(0);
public class Test4
{
public static void main(String[] args)
{
System.out.println(new Integer(0) == 0); //输出:true
System.out.println(new Integer(0) == new Integer(0)); //输出:false
}
}
6.
while (i != 0 && i == -i) { }
可以推断出 i 的类型必然是整数型的。总共存在偶数个 int 数值——准确地说有2的32次方个——其中一个用来表示 0,这样就剩些奇数个 int 数值来表示正整数和负整数,这意味着正的和负的 int 数值的数量必然不相等。这暗示着至少有一个 int数值,其负值不能正确地表示成为一个 int 数值。
事实上,恰恰就有一个这样的 int 数值,它就是 Integer.MIN_VALUE,十六进制表示是 0x80000000。其符号位为 1,其余所有的位都是 0。如果我们对这个值取负值,那么我们将得到 0x7fffffff+1,也就是 0x80000000,即
Integer.MIN_VALUE!因此,Integer.MIN_VALUE 是它自己的负值,Long.MIN_VALUE 也是一样。对这两个值取负值将会产生溢出,但是 Java 在整数计算中忽略了溢出。
因此可以这样声明:int i = Integer.MIN_VALUE; 或者:long i = Long.MIN_VALUE;
public class Test4
{
public static void main(String[] args)
{
int i = Integer.MIN_VALUE;
long j = Long.MIN_VALUE;
System.out.println(i == -i); //输出:true
System.out.println(j == -j); //输出:true
}
}
分享到:
相关推荐
java无限级树 带checkbox 按表中固定的格式入数据 very good ,very strong
无限循环是指循环的条件始终为真,因此循环将永远执行下去,直到程序被强制终止。 2、无限循环案例 while (true) { System.out.println("This is an infinite loop"); } 三、while 循环 1、什么是while循环? while...
在cmd窗口实现简单的动画,今天翻文档时发现了几个原来学java时几个有意思的小程序,拿出来跟大家分享一下,其实我想设置一分,但最少要设置两分
主要介绍了Java实现批量向mysql写入数据的方法,涉及java基于JDBC连接mysql数据库及写入数据的相关操作技巧,非常简单实用,需要的朋友可以参考下
是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入: 1,7 则输出: 0.[142857] 输入: 7,6 则输出: 1.1[6...
安卓选择树结构, 可无限循环,纯java实现...
精彩编程与编程技巧-如何设计一个可中断循环的按钮。 ...
与解决json-lib无限循环出错 博文对于的工程文件,项目中对解决方法做了部分探索,不过比较粗糙,希望能和大家分享学习
Java循环的一个小问题,java中for(int i= 0; i;i=i++)System.out.print(i);为什么无限输出0
主要介绍了java中hasNextInt判断后无限循环输出else项的解决方法的相关资料,需要的朋友可以参考下
android左右循环滑动效果,核心代码非本人编写,我只是进行了修改优化,提供给大家分享,希望对需要的朋友有帮助!
Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。 Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的数据的访问和有效管理(增删改),而Stream并没有提供访问和管理元素的...
localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...
简单的无限循环ATM机的实现 使用编程习题9.7中创建的Account类来模拟一台ATM机。创建一个有10个账户的数组,其id为0,1,…9,并初始化收支为100美元 详见题目Java语言程序设计与数据结构中文版347页10.7
服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8080,然后无限循环调用accept()方法接受客户程序的连接Q系统的设计于实现
有一个按钮和标签,标签可以在上面画线,单击按钮后则进入无限循环。
上文的童鞋无限循环的scrollview的需求在设计师的要求下必须换掉,这次的需求改成了主屏幕上三个button,实现无限循环滑动,每次滑动只能滑出来一个,不死心的我在上文scrollview上奋战了一天,还是敌不过不停出现的...
lib-recur Java的循环处理器 该库解析和定义的重复出现字符串,并迭代实例。... 在这种情况下,必须限制实例数,以避免无限循环。 以下代码遍历重复规则的实例: RecurrenceRule rule = new RecurrenceRule("F
下面小编就为大家带来一篇java、js中实现无限层级的树形结构方法(类似递归)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一款可以让RecyclerView无限循环的LayoutManager 使用 添加依赖 implementation ' cn.student0.manager:repeatmanager:1.0.2 ' 在代码中使用 RecyclerView recyclerView = findViewById( R . id . rv_demo); ...