当前位置: 首页 > 知识库问答 >
问题:

为什么无限循环终止?或者无限

程亦
2023-03-14

我在尝试一个测试,我写了这个程序。。。

#include<iostream>
using namespace std;
main()
{
    int arr[5]={1,2,3,5,3}, num=5;
    for(int i=0; i< num; i++)
    {
        for(int j=(i+1); i< num; j++)
        {
            if (arr[i]==arr[j])
            {
                cout<<"test";
            }
            cout<<j<<endl;
        }
    }
}

六羟甲基三聚氰胺六甲醚。。。在下面的代码中,我知道我用了“I”而不是“j”,所以为了解决这个问题,我用了这个

for(int j=(i+1); i< num; j++)

我在节目中遇到的问题是-

for(int j=(i+1); i< num; j++)
        {
            if (arr[i]==arr[j])
            {
                cout<<"test";
            }
            cout<<j<<endl;
        }

在上面的代码中,当我删除这个if块时-

if (arr[i]==arr[j])
            {
                cout<<"test";
            }

这个节目无限期地进行。。。。。。。。。但当我再次放置这个if块时,程序在执行一段时间后自动终止。我也在这个链接上读到了这一点,但它展示了java的例子

它们显示了负值的原因,但在我的程序中没有垃圾值。

共有3个答案

施永宁
2023-03-14

我认为,代码中有问题的部分是

for(int j=(i+1); i< num; j++)

在检查i时,您正在增加j

如果你用

for(int j=(i+1); j < num; j++)

它可能会开始工作。

if (arr[i]==arr[j])
{
  cout<<"test";
}

因为int有有限的可能值。当达到int变量的最大值时,值1是可能的最小值int。(正如@user17732522所指出的,这种行为可能完全不同——程序崩溃或这里发生了一些令人讨厌的事情——因为int“溢出”的行为是未定义的。因此,您的程序内存可能已经损坏,需要执行一些操作才能看到它的发生……例如,通过程序崩溃。)

现在,让我们想想,arr[i]做了什么arr基本上是指向内存的指针,数组从这里开始,[i]操作与*(arr i)相同。

现在,有两种可能发生的情况

  • i为正且在数组之外时,程序崩溃

在这两种情况下,程序都会崩溃,因为您试图访问受保护或不存在的内存区域。这取决于系统的体系结构——例如,在64位AMD64系统的负区中,如果没有16 EB的RAM,显然是在访问不存在的内存。在这种情况下,该程序必须导致处理器中断,这会导致操作系统中断,从而导致应用程序死机。

为什么删除块时不会崩溃?没有人试图访问*(arr j),因此,j从最小可能值重复到最大可能值,没有任何问题。

洪子晋
2023-03-14

如果没有if(arr[i]==arr[j]),你就会有一个无限循环,这在这种情况下是完全有效的。

然而,随着代码中的if(arr[i]==arr[j])j正在递增,并且您将超出数组的边界(如您所知)。在C中,这是未定义的行为,意味着任何事情都可能发生。在您的情况下,它似乎正在导致程序崩溃(这实际上是一件好事,因为它表示错误)。

锺离宸
2023-03-14

循环条件永远不会为假。因此程序将无限期地继续运行。

但是,对于if(arr[i]==arr[j]),您可以访问arr边界之外的内容。因此,程序的行为是未定义的。当程序的行为未定义时,它不一定像您期望的那样运行。例如,它可能不会无限期地继续运行。

即使没有if(arr[i]==arr[j]),当循环计数器溢出时,循环最终也会有未定义的行为。但是具有未定义行为的程序不一定会像您预期的那样运行。例如,它可能会无限期地继续运行。

 类似资料:
  • 问题内容: 我正在浏览旧的考试问题(当前是大学一年级),我想知道是否有人可以更彻底地解释为什么以下循环在预期的情况下不会结束。为什么会这样?我了解由于舍入错误或其他原因,它会跳过100.0,但是为什么呢? 问题答案: 数字0.1不能精确地用二进制表示,就像1/3不能精确地用十进制表示一样,因此您不能保证: 这是因为在二进制文件中: 但是,双精度数不能包含无限精度,因此,正如我们将1/3近似为0.3

  • 问题内容: 我有一段简单的代码,该代码 应该 是一个无休止的循环,因为它将一直在增长,并且始终会比更大。 但实际上,它可以打印并且不会无限循环。我不知道为什么。但是,当我以以下方式调整代码时: 这变成一个无尽的循环,我不知道为什么。java是否会识别出一个无穷循环并在第一种情况下跳过它,而在第二种情况下必须执行一个方法调用,以使其表现出预期的效果?困惑:) 问题答案: 这两个例子并不是无止境的。

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 问题内容: 我已经存储了一个in in 组件。我传递的和为从父到子。然而,如果在父母一些事件,被触发,因此,儿童被执行。 由于造成了无限循环 (因为它触发了子组件内部的setState()) ,所以我放置了条件。但这不能防止错误。 子组件即如下: 父组件即MonthToDate如下: 我想念什么? 另外,在收到in子组件之后,我想基于那个渲染另一个组件。例如component只能处理一种类型的。如

  • 但是如果我在这个循环中打印了一些内容,那么它就不会终止。为什么会这样?

  • 当我开始我的代码 我得到无限循环。为什么?