我刚刚开始在学校学习Java,现在我被卡住了。
public static void main(String[] args) {
int count = 0;
int point = 5;
while(point != count++){
System.out.println(count);
}
控制台: 1 2 3 4 5
为什么数字" 5"还在印吗?不是这个循环应该只在点!=计数+ 1时运行吗?然后它应该在5 = 5时停止,不是它(" 5"不会被打印)?
非常感谢。
答案 0 :(得分:12)
point != count++
这意味着比较point
和count
的当前值不等式,然后递增count
。所以当count
为4时
point
(不等)count
将成为5 point
进行比较(等于)前缀增量运算符++count
将在比较中使用该值之前递增。
答案 1 :(得分:10)
因为您在增加==
之前进行了比较++
,如果要修复它,请更改为++count
答案 2 :(得分:6)
我同意关于假设当前结构的问题细节的先前答案。但是,最好遵循Java语言规范中的建议15.7. Evaluation Order,其中说明
Java编程语言保证了操作数 运算符似乎在特定的评估顺序中进行评估, 即,从左到右。
建议代码不要严格依赖此规范。 当每个表达式最多包含一侧时,代码通常更清晰 效果,作为最外层的操作,当代码不依赖时 究竟哪个例外由于从左到右而产生 表达式评估。
count++
有副作用,并不是其声明中的最外层操作。这最终导致您难以推理代码。如果你在println
调用之前或之后在循环内完成了增量,那就更清楚了。
推理程序的关键是拥有简单明了的不变量。这是您的程序的替代版本,过度评论以进行展示。
public class Test {
public static void main(String[] args) {
/*
* Initialize count to the first value that will be used in the loop
* payload.
*/
int count = 1;
int point = 5;
while (count < point) {
/*
* Loop payload - executed with the same value of count as the test above
*/
System.out.println(count);
/*
* Increment count for the next test and, if the test passes, payload
* execution.
*/
count++;
}
}
}
我使用“payload”来表示循环所在的代码,在这种情况下只是println
调用。
我的不变量是:
count
的值是将要测试的值,如果通过测试,则是将在有效负载中使用的值。count
的值增加了一个。循环包含两个带副作用的操作,调用println
和count
增量。它们中的每一个都是其声明中最外层的操作。
答案 3 :(得分:5)
这是java中前缀(++i
)和后缀(i++
)运算符之间的区别。
你使用的是postfix,这意味着它首先返回count的值,然后增加它。如果你使用point != ++count
,你将无法获得5张
答案 4 :(得分:4)
计数在评估而之后才会递增。你需要这样做:
public static void main(String[] args) {
int count = 0;
int point = 5;
while(point != ++count){
System.out.println(count);
}
在这种情况下, ++ 导致计数首先更改,然后再根据点进行检查。
很容易记住:如果 ++ 之前出现,它会先增加。如果经过评估后再进行评估。这同样适用于作业。
话虽如此,我同意Patricia的回答,即递增应该在while块内完成,如下所示:
public static void main(String[] args) {
int count = 0;
int point = 5;
while(point != count){
System.out.println(count);
count++;
}
这更清晰,更容易推理。
答案 5 :(得分:2)
问题是你在增加它之前比较计数。
您的意思是:while(point != count +1)
你想要什么:while(point != ++count)
希望有所帮助!
答案 6 :(得分:-1)
这是我的理解: 如果您在 for 循环中使用 prefix 或 post,它根本不会改变程序的行为。 所以问题是什么时候重要?
当我们将前缀或后缀与其他比较运算符一起使用时很重要例如
前缀 我 = 1; result = 5 + ++i //这个答案是 7 解释:这就是我的想法 - 因为它在“i”之前有 ++ 然后首先我们将增加 i 然后将其添加到 5。
后缀
i=1; 结果 = 5 + i++; //答案是6 说明: 因为这个在 i 之后有 ++ 然后首先我们将添加 i 值然后递增 所以首先将 1 添加到 5,然后 i 的新值将是 2
简而言之 i++ 首先将值提供给比较运算符,然后递增。这解释了你的情况 5!= 4 ,然后 i 增加到 5 并打印出来。