Java for循环输出[重复]

Posted

技术标签:

【中文标题】Java for循环输出[重复]【英文标题】:Java for loop output [duplicate] 【发布时间】: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 是的,她知道。她在问为什么它没有增加两次。 【参考方案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

【讨论】:

以上是关于Java for循环输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

编写java程序,应用for循环打印菱形。

java使用for循环输出图形 * *** ***** ******* ***** *** *

java 增强for循环为啥输出的是一串地址值?

java用for循环输出长方形

Java中的for循环[重复]

与map函数结合使用时,for循环返回空白输出[重复]