【问题标题】:Java for loop output [duplicate]Java for循环输出[重复]
【发布时间】:2015-11-27 13:45:45
【问题描述】:
import java.io.*;
public class test {
    public static void main(String args[]) {
        int a=0, b=6, sum;
        for(int i=0; i<=2; i++) {
            System.out.println(i=i++);
        }
    }
}

输出:0 | 1 | 2。但实际上我认为应该是0 | 2。请解释我为什么错了?提前谢谢你。

【问题讨论】:

  • 你将 i 增加两次。
  • 只需打印 System.out.println(i);在这里工作
  • i++ 是在将 i 分配给 i 之后执行的,所以扩充丢失了。
  • i = i++的赋值与i = i基本相同。
  • @Karbos 是的,她知道。她在问为什么它没有增加两次。

标签: java loops for-loop conditional-statements increment


【解决方案1】:

在您的代码中:

for(int i=0;i<=2;i++)
{
  System.out.println(i=i++);  //here the value of i is incremented after it is assigned to i.
}

当您执行i=i++ 时,i 在分配后递增。因此你没有得到预期的结果。

您可以使用预增量运算符并查看差异。

for(int i=0;i<=2;i++)
{
   System.out.println(i=++i);  
}

这里有一个相关的帖子可以帮助你:What is x after “x = x++”?

【讨论】:

    【解决方案2】:

    区别在于这行代码:

    System.out.println(i=i++);
    

    i++ 是一个后自增,意味着它只在语句的其余部分之后执行。

    所以,它有点像这样:

    System.out.println(
      int tempI = i;
      i = tempI;
      tempI = i + 1;
      );
    

    最后,你打印了 i 的值,而 tempI 的值在那之后没有被使用,所以被认为是丢失了。

    【讨论】:

    • 那是错误的解释。你可以尝试执行这个{ i=i++; System.out.println(i); } 吗?
    • Suresh:还是一样。只是,在达到打印语句之前, i 将被扩充。我使用 tempI 作为逻辑示例,而不是实际代码的示例。
    【解决方案3】:

    即使不使用调试器,也可以自己轻松测试。

        int a=0,b=6, sum;
        for(int i=0;i<=2;i++)
        {
            System.out.println(i=i++);
            System.out.println("Value of i:" + i);
        }
    

    输出:

    0
    Value of i:0
    1
    Value of i:1
    2
    Value of i:2
    

    问题: 那么为什么System.out.println(i=i++); 之后,i 的值没有增加呢?

    答案:这是因为i++ 表示后增量。右侧的i在该行之后增加一个。

    //Let say i is 0.
    i = i++; 
    

    i++ 表示右侧i 仍然为0,直到它进入下一行。因此,0 被分配给左侧的i

    【讨论】:

    • 那么在 SOP(i=i++) 中,i 的值应该在这一行之后增加。所以在编译器打印这个之后,它然后进入for循环增量,所以这里的'i'必须增加它对吗?然后我再次在 for 循环中增加它,所以基本上它增加了两次,我猜。
    • @Ashley 仅当您在 RHS 上使用不同的变量时,您的陈述才是正确的。示例:i + b++。你打印 b 之后它会给你 7。但是如果你在 LHS 和 RHS 上使用相同的变量(即i = i++),你会将旧值分配回它自己。之后, i++ 被忽略。这就是 Java 为后增量设计的方式。与 C++ 不同。
    【解决方案4】:

    如果可行:。

    for(int i=0;i<=2;i++)
    {
        System.out.println(i=++i);
    } 
    

    因为这不起作用?:

    for(int i=0;i<=2;i++)
    {
        System.out.println(i=i++);
    } 
    

    显然println 方法中的后增量处理方式不同。

    【讨论】:

      【解决方案5】:

      请看这个sn-p:

      for (int i=0; i<=2;i+=2){
              System.out.println("i= "+ i);
          }
      

      这应该给你一个简短的方法来做到这一点。

      【讨论】:

        【解决方案6】:

        如果你这样写,这是 C 或 C++ 中未定义的行为:

        i = i++;
        

        无法确定评估顺序的原因。因此,如果您用 C 或 C++ 编写此代码,则无法保证会生成什么。

        Java 中,这种歧义已从设计中移除。评价顺序如下:

        i = i++;    //value of i++ is stored (0 is stored in this case)
                    //i increased by 1, i is now 1
                    //The stored value assigned back to i (0 assigned to i)
        

        【讨论】:

        • @ashley 看看,这个解决方案应该是你要找的。​​span>
        • 谢谢,有道理。美好的一天(y)
        • @ashley 如果我的解决方案解决了您的问题,您可以通过单击我的答案旁边的勾来接受我的解决方案。如果您还有其他问题,请告诉我 ;)
        【解决方案7】:

        答案是为上述代码生成的字节码。它将 i 的旧值存储回 i 中。因此 i=i++ 语句在逻辑上没有影响。

        iconst_0
        istore_1
        goto 11
        getstatic java/lang/System/out Ljava/io/PrintStream;
        iload_1
        iinc 1 1
        dup
        istore_1
        invokevirtual java/io/PrintStream/println(I)V
        iinc 1 1
        iload_1
        iconst_2
        if_icmple 4
        return
        

        【讨论】:

          猜你喜欢
          • 2017-10-25
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          • 2014-01-12
          • 2016-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多