创建一个 for(永远)循环。系统不想启动



我在c++中编写了如下代码:

int main() {
    int myArray[5];
    int n =1;
#define EVER ;;
    for(EVER){
       myArray[n] +=n++;
    }
    return 0;
}

我让它运行,我得到一个蓝屏。在这之后,我的电脑不想启动。我做错了什么?我是c++新手。由于

您的程序如此之小,却充斥着数量惊人的未定义行为。就c++标准而言,未定义行为意味着程序的行为是不可确定的。换句话说,就c++标准而言,任何事情都有可能发生。

int myArray[5];

在这个语句中,您没有初始化myArray的值。虽然这本身不是未定义的行为,但当您尝试在写入这些值之前读取这些值时,它将是未定义的。

myArray[n] += n++;

该语句本身,没有其他上下文,是未定义的行为。不指定先求myArray[n]中的n,还是先求n++。换句话说,这两个表达式相对于彼此是无序的。一个是读取n的值,另一个是修改它。读取变量的值并在没有插入序列点的情况下修改它是未定义的行为。

最后,假设上面的代码以您期望的方式运行,您将永远循环,不断增加n。一旦n达到5,您将不再具有对myArray中的这些位置进行读写的权限。一旦n达到6,你就不再有访问这些位置的权限了。这样做是更多未定义的行为。

我描述的前两个问题,虽然它们很糟糕,但实际上它们很可能不会导致你所看到的那种行为(至少它们本身不会)。第三个错误,写入数组末尾以外的内存位置,这很可能是您所看到的主要错误的罪魁祸首。

这个版本可以正常工作。它将填充数组,但不会填充所有计算机内存。

int main()
{
  int myArray[5];
  for(int n = 1;;++n)
    myArray[n % 5] = n;
}

最新更新