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循环输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章