随笔分类 - emanual_谜题_循环谜题(24-35)
摘要:下面的程序在模仿一个简单的时钟。它的循环变量表示一个毫秒计数器,其计数值从0开始直至一小时中包含的毫秒数。循环体以定期的时间间隔对一个分钟计数器执行增量操作。最后,该程序将打印分钟计数器。那么它会打印出什么呢? 在这个程序中的循环是一个标准的惯用for循环。它步进毫秒计数器(ms),从0到一小时中的
阅读全文
摘要:与谜题26和27中的程序一样,下面的程序有一个单重的循环,它记录迭代的次数,并在循环终止时打印这个数。那么,这个程序会打印出什么呢? 表面的分析也许会认为这个程序将打印50,毕竟,循环变量(f)被初始化为2,000,000,000,而终止值比初始值大50,并且这个循环具有传统的“半开”形式:它使用的
阅读全文
摘要:请提供一个对i的声明,将下面的循环转变为一个无限循环。这个循环不需要使用任何5.0版的特性: 这仍然是一个循环。在布尔表达式(i != 0 && i == -i)中,一元减号操作符作用于i,这意味着它的类型必须是数字型的:一元减号操作符作用于一个非数字型操作数是非法的。因此,我们要寻找一个非0的数字
阅读全文
摘要:请提供一个对i的声明,将下面的循环转变为一个无限循环: 与前一个谜题不同,你必须在你的答案中不使用浮点数。换句话说,你不能把i声明为double或float类型的。 与前一个谜题一样,这个谜题初看起来是不可能实现的。毕竟,一个数字总是等于它自身加上0,你被禁止使用浮点数,因此不能使用NaN,而在整数
阅读全文
摘要:请提供一个对i的声明,将下面的循环转变为一个无限循环: 回想一下,>>>=是对应于无符号右移操作符的赋值操作符。0被从左移入到由移位操作而空出来的位上,即使被移位的负数也是如此。 这个循环比前面三个循环要稍微复杂一点,因为其循环体非空。在其循环体中,i的值由它右移一位之后的值所替代。为了使移位合法,
阅读全文
摘要:请提供一个对i的声明,将下面的循环转变为一个无限循环: 噢,不,不要再给我看起来不可能的循环了!如果i <= j 并且 j <= i,i不是肯定等于j吗?这一属性对实数肯定有效。事实上,它是如此地重要,以至于它有这样的定义:实数上的≤关系是反对称的。Java的<=操作符在5.0版之前是反对称的,但是
阅读全文
摘要:请提供一个对i的声明,将下面的循环转变为一个无限循环: 这个循环可能比前一个还要使人感到困惑。不管在它前面作何种声明,它看起来确实应该立即终止。一个数字总是等于它自己,对吗? 对,但是IEEE 754浮点算术保留了一个特殊的值用来表示一个不是数字的数量[IEEE 754]。这个值就是NaN(“不是一
阅读全文
摘要:下面的谜题以及随后的五个谜题对你来说是扭转了局面,它们不是向你展示某些代码,然后询问你这些代码将做些什么,它们要让你去写代码,但是数量会很少。这些谜题被称为“循环者(looper)”。你眼前会展示出一个循环,它看起来应该很快就终止的,而你的任务就是写一个变量声明,在将它作用于该循环之上时,使得该循环
阅读全文
摘要:与谜题26中的程序一样,下面的程序也包含了一个记录在终止前有多少次迭代的循环。与那个程序不同的是,这个程序使用的是左移操作符(<<)。你的任务照旧是要指出这个程序将打印什么。当你阅读这个程序时,请记住 Java 使用的是基于2的补码的二进制算术运算,因此-1在任何有符号的整数类型中(byte、sho
阅读全文
摘要:下面的程序计算了一个循环的迭代次数,并且在该循环终止时将这个计数值打印了出来。那么,它打印的是什么呢? 如果你没有非常仔细地查看这个程序,你可能会认为它将打印100,因为END比START大100。如果你稍微仔细一点,你可能会发现该程序没有使用典型的循环惯用法。大多数的循环会在循环索引小于终止值时持
阅读全文
摘要:下面的程序对一个变量重复地进行增量操作,然后打印它的值。那么这个值是什么呢? 乍一看,这个程序可能会打印100。毕竟,它对j做了100次增量操作。可能会令你感到有些震惊,它打印的不是100而是0。所有的增量操作都无影无踪了,为什么? 就像本谜题的题目所暗示的,问题出在了执行增量操作的语句上: 大概该
阅读全文
摘要:下面的程序循环遍历byte数值,以查找某个特定值。这个程序会打印出什么呢? 这个循环在除了Byte.MAX_VALUE之外所有的byte数值中进行迭代,以查找0x90。这个数值适合用byte表示,并且不等于Byte.MAX_VALUE,因此你可能会想这个循环在该迭代会找到它一次,并将打印出Joy!。
阅读全文