标签: infinite-loop

为什么这种方法导致无限循环?

我的一位同事带着一个关于这种方法的问题来找我,导致无限循环.实际的代码有点过于介绍这里,但基本上问题归结为:

private IEnumerable<int> GoNuts(IEnumerable<int> items)
{
    items = items.Select(item => items.First(i => i == item));
    return items;
}
Run Code Online (Sandbox Code Playgroud)

应该(你会认为)只是一种非常低效的方式来创建列表的副本.我叫它:

var foo = GoNuts(new[]{1,2,3,4,5,6});
Run Code Online (Sandbox Code Playgroud)

结果是无限循环.奇怪.

我认为修改参数在风格上是一件坏事,所以我稍微改了一下代码:

var foo = items.Select(item => items.First(i => i == item));
return foo;
Run Code Online (Sandbox Code Playgroud)

那很有效.也就是说,该计划已经完成; 没有例外.

更多实验表明这也有效:

items = items.Select(item => items.First(i => i == item)).ToList();
return items;
Run Code Online (Sandbox Code Playgroud)

一样简单

return items.Select(item => .....);
Run Code Online (Sandbox Code Playgroud)

好奇.

很明显,问题与重新分配参数有关,但仅限于评估延迟超出该语句.如果我添加ToList()它的工作原理.

对于出了什么问题,我有一个普遍的,模糊的想法.它看起来像是在Select迭代它自己的输出.这本身有点奇怪,因为IEnumerable如果它迭代的集合发生变化,通常会抛出.

我不明白,因为我并不熟悉这些东西如何工作的内部,这就是重新分配参数导致这个无限循环的原因.

是否有人对内部人员有更多的了解谁会愿意解释为什么无限循环发生在这里?

c# linq stack-overflow infinite-loop

64
推荐指数
3
解决办法
4268
查看次数

C/C++中的无限循环

有几种可能性来进行无限循环,这里有一些我会选择:

  • for(;;) {}
  • while(1) {}/while(true) {}
  • do {} while(1)/do {} while(true)

是否有某种形式应该选择?现代编译器是否会在中间和最后一个语句之间产生影响,或者它是否意识到它是一个无限循环并完全跳过检查部分?

编辑:因为已经提到我忘记了goto,但这是因为我根本不喜欢它作为一个命令.

Edit2:我对从kernel.org获取的最新版本做了一些grep.我确实看起来随着时间的推移没有太大变化(至少在内核中) 在此输入图像描述

c c++ loops infinite-loop

57
推荐指数
7
解决办法
9万
查看次数

在jsfiddle中取消无限循环执行

当您在Chrome中的jsfiddle中获得无限循环时,您唯一的选择(我知道)是关闭选项卡.当然,这意味着您在当前窗口中丢失了所有工作!是否有一种简单的方法可以阻止无限执行的脚本?

  1. 我打开了开发人员工具,因为我正在做一些调试.
  2. 我能够暂停脚本并逐步完成循环.
  3. 我找不到任何地方停止脚本.
  4. 我无法修改脚本或变量以停止无限循环(因为脚本执行发生在单独域上的iframe中,因此不允许使用JavaScript修改iframe中的数据并在控制台中生成异常).

这一切都是因为我决定在我的循环中交换方向

for (var c = 0; c <= 11; c++)
Run Code Online (Sandbox Code Playgroud)

for (var c = 12; c > 0; c++)
Run Code Online (Sandbox Code Playgroud)

但正如你在上面所看到的,我忘了将它c++改为c--.

有任何想法吗??我仍然打开标签,我希望在不关闭标签的情况下取回标签:-)

javascript google-chrome infinite-loop jsfiddle

55
推荐指数
2
解决办法
3万
查看次数

CPU友好的无限循环

编写无限循环很简单:

while(true){
    //add whatever break condition here
}
Run Code Online (Sandbox Code Playgroud)

但这会破坏CPU的性能.此执行线程将尽可能多地从CPU的电源中获取.

降低对CPU影响的最佳方法是什么?添加一些Thread.Sleep(n)应该可以解决问题,但为Sleep()方法设置高超时值可能表示对操作系统的应用程序无响应.

假设我需要在控制台应用程序中每分钟执行一次任务.我需要继续Main()在"无限循环"中运行,而计时器将触发将完成工作的事件.我想保持Main()对CPU的最小影响.

你有什么方法可以建议.Sleep()可以,但正如我已经提到的,这可能表明操作系统没有响应.

后期编辑:

我想更好地解释一下我在寻找什么:

  1. 我需要一个控制台应用程序不是Windows服务.控制台应用程序可以使用Compact Framework模拟Windows Mobile 6.x系统上的Windows服务.

  2. 只要Windows Mobile设备运行,我需要一种方法让应用程序保持活动状态.

  3. 我们都知道控制台应用程序运行只要其静态Main()函数运行,所以我需要一种方法来阻止Main()函数退出.

  4. 在特殊情况下(例如:更新应用程序),我需要请求应用程序停止,因此我需要无限循环并测试某些退出条件.例如,这就是为什么Console.ReadLine()我没用.没有退出条件检查.

  5. 关于上面,我仍然希望Main()函数尽可能地对资源友好.让我们确定检查退出条件的函数的指纹.

.net c# console-application infinite-loop

53
推荐指数
2
解决办法
5万
查看次数

PHP中while(true)和for(;;)之间有什么区别?

有没有之间的PHP任何差异while(true)for(;;)除了语法和可读性?

编辑:我不认为这是重复 - 我想知道PHP特有的答案.就发动机而言,有什么真正的区别吗?他们编译成同样的东西吗?他们有同等的表现吗?

编辑2:我也不会认为相对表现和相关的OpCodes是基于意见.可读性存在意见空间,但这显然不是问题.

php for-loop infinite-loop while-loop php-internals

42
推荐指数
1
解决办法
2820
查看次数

字典无限循环意外退出

我正在尝试在Python中创建无限循环的各种方法(除了通常之外while True),并提出了这个想法:

x = {0: None}

for i in x:
    del x[i]
    x[i+1] = None  # Value doesn't matter, so I set it to None
    print(i)
Run Code Online (Sandbox Code Playgroud)

在纸面上,我找到了无限循环的方式:

  1. 我遍历字典中的键值
  2. 我删除了那个条目.
  3. 循环中的当前计数器位置+ 1将是具有None更新字典的值的新键.
  4. 我输出当前的计数器.

在我看来,这应该以一种无限循环的方式输出自然数:

0
1
2
3
4
5
.
.
.
Run Code Online (Sandbox Code Playgroud)

我认为这个想法很聪明,但是当我在Python 3.6上运行时,它会输出:

0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

是的,它在5次迭代后以某种方式停止了.显然,循环的代码块中没有基本条件或标记值,那么为什么Python只运行此代码5次?

python dictionary infinite-loop

42
推荐指数
3
解决办法
2149
查看次数

类构造函数可以永远阻塞吗?

假设我有一个在无限循环中提供某种功能的对象。

将无限循环放在构造函数中是否可以接受?

例子:

class Server {
    public:
    Server() {
        for(;;) {
            //...
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

或者如果构造函数永远不会完成,C++ 中是否存在固有的初始化问题?

(这个想法是运行你刚才说的服务器Server server;,可能在某个线程中......)

c++ multithreading constructor infinite-loop

42
推荐指数
3
解决办法
4236
查看次数

Prolog继承符号表示不完整的结果和无限循环

我开始学习Prolog,并首先了解了继承符号.

这就是我在Prolog中发现编写Peano公理的地方.

参见PDF的第12页:

sum(0, M, M).
sum(s(N), M, s(K)) :-
    sum(N,M,K).

prod(0,M,0).
prod(s(N), M, P) :-
    prod(N,M,K),
    sum(K,M,P).
Run Code Online (Sandbox Code Playgroud)

我把乘法规则放到了Prolog中.然后我做查询:

?- prod(X,Y,s(s(s(s(s(s(0))))))).
Run Code Online (Sandbox Code Playgroud)

这意味着基本上找到6的因子.

结果如下.

X = s(0),
Y = s(s(s(s(s(s(0)))))) ? ;
X = s(s(0)),
Y = s(s(s(0))) ? ;
X = s(s(s(0))),
Y = s(s(0)) ? ;
infinite loop
Run Code Online (Sandbox Code Playgroud)

这个结果有两个问题:

  1. 并非所有结果都显示,请注意结果X = 6,Y = 1缺失.
  2. 它不会停止,除非我按Ctrl + C然后选择中止.

所以...我的问题是:

  1. 这是为什么?我尝试转换"prod"和"sum".结果代码给了我所有结果.再说一遍,为什么?它仍然是死循环.
  2. 如何解决?

我在无限循环中阅读了另一个答案.但我很感激有人根据这个场景做出回答.这对我很有帮助.

prolog infinite-loop successor-arithmetics non-termination failure-slice

41
推荐指数
2
解决办法
2855
查看次数

Java:无限循环公约

Java中无限循环的约定是什么?我应该写while(true)还是for(;;)?我个人会使用,while(true)因为我经常使用while循环.

java conventions infinite-loop

39
推荐指数
5
解决办法
8万
查看次数

Enumerator.MoveNext()的奇怪行为

有人可以解释为什么这段代码在无限循环中运行?为什么总是MoveNext()回来true

var x = new { TempList = new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
while (x.TempList.MoveNext())
{
  Console.WriteLine("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

c# enumerator infinite-loop

35
推荐指数
1
解决办法
1649
查看次数