【问题标题】:Does this 'for' loop stop, and why/why not? for (int i=1; 1/i > 0; i++) { }这个“for”循环是否停止,为什么/为什么不停止? for (int i=1; 1/i > 0; i++) { }
【发布时间】:2016-09-27 13:51:41
【问题描述】:

这个for 循环会停止吗?

for(int i=1; 1/i > 0; i++) {

}

如果是这样,何时以及为什么?有人告诉我它会停止,但我没有理由这样做。

【问题讨论】:

  • 不是立即停止吗? 1/20,所以循环应该只经过一次迭代,不是吗?
  • 你运行它找出来了吗?
  • 如果您将社区对这个问题的回答与今年早些时候的回答进行比较,那就太有趣了:stackoverflow.com/questions/37827073/…
  • Zar,我对这两个问题都投了反对票。将其输入 IDE 并运行它需要 10 秒。查找 Java 语言规范并了解 Java 如何除整数只需要稍长一点的时间。用任何语言在 Stack Overflow 上发布这样的内容绝对是荒谬的。归根结底,要回答“当我运行这个 Java(或 JavaScript)程序时会发生什么”这个问题的最佳方法是运行该程序。
  • @DavidWallace,我想执行环境也解释了为什么循环停止或为什么没有停止? :)

标签: java


【解决方案1】:

是的。
第一次迭代:i = 1, 1/1 = 1 > 0,所以它循环。
第二次迭代:i = 2, 1/2 = 0 !> 0(整数除法),所以它停止了。

【讨论】:

  • 整数除法的结果被截断(即,十进制数被删除)。 1/2 = 0.5,所以在截断后你剩下 0。
  • 不仅仅是截断,它只是整数数学。 1/2 为 0,余数为 1。
  • @Zar,如果我将循环更改为 for(double i=1; 1/i > 0; i++) {},我会得到与 JavaScript 相同的行为,即循环永远不会停止吗?
  • 理论上是的,因为将 1 除以非零数字不会导致零(除非您的数字变得足够小以至于它不能存储在双精度中并变为零,但是我不确定当你变得太小时是否真的会发生这种情况。我还没有尝试过)。
  • 双倍循环不会停止。最终,双打变得如此之大,以至于++ 不会改变它们。
【解决方案2】:
  1. 第一次迭代:i =1,1/1 等于 1,所以继续。
  2. 第二次迭代: i = 2 , 1/2 等于 0 因为它是整数除法,所以条件为假并且停止。

关于整数除法的详细信息记录在javadoc

【讨论】:

  • 你回答的第一行对我来说没有意义
【解决方案3】:

是的,for 循环在一次迭代后停止。在第二次迭代中将 1 除以 2 将导致 for 循环停止,因为整数不记录小数,这意味着一除以二将是 0 而不是 0.5。

【讨论】:

    【解决方案4】:

    1/2 被评估为一个整数,并简单地去掉小数点。因此1/2 = 0

    如果其中一个数字是浮点数(例如 1.0/21/2.0),它将返回预期的 0.5

    【讨论】:

      【解决方案5】:

      在这段代码中

      for(int i=1; 1/i > 0; i++) {
      //any code here
      }
      

      在你的代码中

      1. 设置条件大于0的数字
      2. 计数器从 1(整数)开始
      3. 第一次运行循环面颊条件 1/1 > 0 => true 代码执行。
      4. 在第一次运行计数器后递增 1。
      5. 之后 for 循环面颊条件 1/2 > 0 => false 不执行和 for 循环停止

      为什么 for 循环在 1/2 处停止,因为 1 个整数和 2 个整数
      并且整数/整数必须=整数1/2 = 0(0.5不是整数) 如果您使用此代码,则执行许多 for 循环。 因为 int/float = float 1/1.0 =1 / 1/2.0= 0.5 / 1/3.0 = 0.33333 / 1/4.0 = 0.25 ...等

      for(float i=1; 1/i > 0; i++) {
          //any code here
          }
      

      【讨论】:

        【解决方案6】:

        这是我第一次发帖,我绝对是新手,所以如果我提供了不正确的信息,请纠正我:)。

        我的理解是因为 i 和 1 都是该行中的整数类型:

        for(int i=1; 1/i > 0; i++)

        然后您的程序将自动执行整数除法/算术运算,这会导致模数或余数被丢弃。因此,在第二次迭代期间,0.5 的余数将被丢弃,结果为 0,从而终止循环。

        【讨论】:

          猜你喜欢
          • 2016-10-16
          • 1970-01-01
          • 1970-01-01
          • 2014-08-09
          • 2011-06-14
          • 1970-01-01
          • 2017-05-17
          • 2011-05-21
          相关资源
          最近更新 更多