【问题标题】:Why does my loop only print Negative numbers when there is no condition?为什么我的循环在没有条件时只打印负数?
【发布时间】:2021-09-07 04:10:52
【问题描述】:

喜欢-

编译器在这里打印负数-

    for(short a = 1; ; a++)
    System.out.println(a);
    

但是,这里编译器没有打印任何负数。它打印的是短数据类型的最大值,然后不打印负数-

    for(short a = 1;a<= -2 ; a++)
    System.out.println(a);
   

为什么会这样?

【问题讨论】:

  • 请调试。第一个循环也打印正数和负数。
  • @Haiyanman 考虑 INT 而不是 SHORT
  • 我假设你也得到了正数,然后变成负数。那是因为没有条件循环将永远循环,最终你会溢出。在 Java 中,溢出会环绕到可能的最小值。换句话说,您的循环到达Short.MAX_VALUE,然后下一个增量环绕到Short.MIN_VALUE(负数),然后您从那里增加。
  • @Slaw 是的,我得到了正数和负数。感谢您的解释!
  • 利用从 Short.MAX_VALUE 到 Short.MIN_VALUE 的环绕不是一个好主意,因为对于读者来说你期望发生什么并不明显。良好的编码习惯建议您在不使用诸如此类的副作用的情况下编写您希望循环执行的操作,或者至少记录正在发生的事情。

标签: java infinite-loop


【解决方案1】:

首先,我认为你应该检查这段代码:

for(short a = 1; ; a++)
System.out.println(a);

因为循环从数字开始,从 1 开始,增加到 2,然后到 3,依此类推,直到达到 Short.Max_value,然后转回 Short.Min_value,依此类推。在每次迭代中,它都会继续下去,因为条件在每种情况下都成立

二、这段代码:

for(short a = 1;a<= -2 ; a++)
 System.out.println(a);

实际上并没有打印出任何东西,因为它会打印出从 1 到 -2 的所有数字。或者换一种说法,你从 1 开始,但在下一次迭代开始之前,它比较 1 false,从而停止循环。

【讨论】:

  • 第一个循环最终会将a 递增到Short.MAX_VALUE,然后下一次迭代将导致溢出到Short.MIN_VALUE。这就是负面因素的来源。
  • 我忘记了这种情况,因为我的编译器提前终止了。非常感谢你。修正了我的答案
  • “我的编译器提前终止了” - 什么?如果您的编译器生成的代码不输出负数,那么它不符合 Java。我想你的意思是别的。
  • 我的编译器在打印出数字 1585 后终止,这与 Short.Max_value 相差甚远
  • 我认为@StephenC 的意思是 compiler 不执行代码,所以如果你说 compiler 输出改变循环以提前终止的字节码,那么它不是符合 Java 的实现。也就是说,你所说的编译器很可能不是编译器,而是别的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2021-12-16
  • 2022-08-23
  • 2019-12-23
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多