【问题标题】:Make an for(EVER) loop. System dont't want to boot [closed]做一个 for(EVER) 循环。系统不想启动[关闭]
【发布时间】:2013-04-15 18:12:17
【问题描述】:

我用 C++ 编写了这样的代码:

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

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

【问题讨论】:

  • 你想用这段代码做什么?循环是一个无限循环,直到程序内存不足。
  • 你写了你不应该启动的内存位置。运气不好写到细腻的记忆中
  • 你到底想用这段代码完成什么?

标签: c++ arrays for-loop


【解决方案1】:

由于程序太小,您的程序充满了大量未定义的行为。未定义的行为意味着程序的行为是不可确定的,就 C++ 标准而言。换句话说,就 C++ 标准而言,任何事情都可能发生。

int myArray[5];

在此语句中,您未初始化 myArray 的值。虽然这本身并不是未定义的行为,但是当您在写入这些值之前尝试读取这些值时,您会这样做。

myArray[n] += n++;

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

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

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

【讨论】:

  • 我同意你的所有回答,除了关于阅读n 的部分。后自增运算符不是显式定义为在语句执行后生效吗?换言之,n 的值在第一次迭代中为 1,在第二次迭代中为 2,以此类推。
  • @VinodVishwanath:阅读:stackoverflow.com/questions/4176328/…
  • 谢谢,有趣的一点。
【解决方案2】:

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

int main()
{
  int myArray[5];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2020-07-09
    相关资源
    最近更新 更多