为什么这个循环会无限运行?

24

这是一个简单的C# while循环,但它在无限循环中运行。

int count = 1;
while (count < 10)
{
    count = count++;
}
为什么会这样呢?

4
++count将会执行所需的操作。 - Jordan
4
我认为这个问题不值得赞同,这只是我的想法。问题中的代码表明作者对++后置运算符不理解。 - Davide Piras
16
提示:尝试调试它... - Ali Hasan
4
如果他按照你建议的用 count = ++count; 替换那一行,这段代码会工作,但仍然是"不正确的"。 - Heinzi
3
这个赋值语句 (count = count++;) 没有意义。写整洁的代码就可以了:count++; - Pavel Hodek
显示剩余3条评论
8个回答

58

1
在编程中,为什么 count = count++; 会导致问题,并且解决方案是简单的 count++ 而不是赋值,请解释原因。 - Fenton
6
抱歉,这与运算符优先级无关。此外,说“afterwards”也不准确:值被增加,然后返回一个值,只是返回的是值,请参见Eric Lippert的这篇答案获取详细信息。 - Heinzi
好的,我已经删除了运算符优先级的提及。你得到了我的点赞。 :) - JohnD

35

这将会无限循环。

有两种变量递增的方式:

在这里,count++++count 是不同的,如果你使用了 ++count,它就会生效。

在这里,count = count++ 表示计数变量将会加一,然后把之前的值1赋给计数变量本身,所以计数变量不会改变。


@BinaryWorrier,请使用count = ++count检查它,您会看到它有效! - user1050189
@Mad:我刚刚删除了我的评论,我以为这是一个C++问题,请原谅我的疏忽。谢谢。 - Binary Worrier

27

count = count++; 不会使 count 值增加1。 x++ 是后增量运算符,这意味着表达式返回的值是旧值。因此,在你的代码中,以下内容发生:

int oldValue = count;
count = count + 1;
count = oldValue;

你可能想要写的是 count++;(没有 "count =")。

更多相关信息请参考下面的 SO 问题:


7

++运算符首先保存当前值,然后递增,最后返回保存的值,因此count将永远不会改变。

要么使用++运算符,要么进行赋值。以下所有方法都是等效的:

count++;
count += 1;
count = count + 1;

4
这不是 ++ 运算符的作用。它会先“保存当前值”,然后再执行递增操作,最后返回保存的值。它不会返回在执行递增操作前的值。 - Eric Lippert
@EricLippert:为什么它返回保存的值?它增加了值,然后应该返回增加后的值,对吧?另外,count++会返回count吗?怎么做到的? - RG-3
1
@Gator:后增量运算符会将变量加1并返回未增量的值。前增量运算符会将变量加1并返回增量后的值。 - Eric Lippert
@Gator:请参考https://dev59.com/tXA75IYBdhLWcg3wVniI#3346729了解更多详情。 - Eric Lippert

5
count  = count++;

这是后增加运算符。它会执行以下操作。

int temp = count;
count++;
count = temp;

所以你没有增加计数。使用以下代码:
while (count  < 10)
{
    ++count;
}

你在这里说 count++,然后又说它没有增加 count?难道 count++ 不等于 count = count + 1 吗?你应该说我们没有增加 temp! - RG-3

1

因为

count++

返回count,而不是count+1

只需使用 count++ 而没有赋值或:

count = ++count;

最后一个只是为了解释,但你不应该使用它...

来自: ++ 运算符 (C# 参考)

第一种形式是前缀递增操作。操作的结果是操作数在递增后的值。

第二种形式是后缀递增操作。操作的结果是操作数在递增之前的值。

数字和枚举类型具有预定义的递增运算符。用户定义的类型可以重载 ++ 运算符。对整数类型的操作通常允许在枚举上进行。


为什么 count++ 会返回 count?我认为 count++ 等同于 count = count + 1? - RG-3
@Gator count++ 返回 count,如果你将其赋值,而 ++count 返回 (count + 1)。请查看 ++i 和 i++ 之间的区别:http://msdn.microsoft.com/en-us/library/36x43w8w.aspx - Davide Piras

0

它是无限的,因为您实际上没有增加计数。

count = count++; 将值1分配给计数,然后递增计数,但由于您没有分配递增值,因此计数永远不会增加。

您需要执行以下操作之一:

count++;

或者

count = ++count;

1
不要使用“count = ++count”这种写法。 - Justsalt

0
让我问你一个问题,为什么在一个变量上进行两个操作,而一个操作就足够了呢? 你的意图是什么?count++本身已经足够了,为什么还要再次赋值给count。也许你想做其他事情。 你可以只用count ++,或++ count或count + 1。我认为其他方法会导致两个操作。 对不起我的写作方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接