【问题标题】:For loop condition is a variable without comparisonfor循环条件是一个没有比较的变量
【发布时间】:2013-10-09 01:24:53
【问题描述】:
int a[5] = {1,2,3,4,5};

for (int i = 0; a[i]; i++)
{
    cout << i;

}

此代码产生“0 1 2 3 4”的输出。 它将 a[i] 与什么进行比较,它如何知道在数组的末尾停止而不是过去?

【问题讨论】:

  • 此代码不起作用。除非您将 a[5] 更改为 a[6]
  • 它没有。这是未定义的行为。
  • 轻率的答案是“靠运气”。更深思熟虑的答案可以在下面找到。
  • 当前标题含糊不清,对未来有相同问题的访问者没有用处。

标签: c++


【解决方案1】:

您的代码会导致未定义的行为。表达式a[i] 将在非零时评估为真,如果为零则为假。当你运行它时,你很幸运,内存中的数组后面紧跟着一个 0 字,所以循环停止了。

【讨论】:

    【解决方案2】:

    它正在读取数组,而那里的内存恰好为零,这完全是幸运的。读取该数组的末尾是未定义的行为,结果可能随时改变,所以永远不要依赖它。

    【讨论】:

      【解决方案3】:

      您可以将a[i]0 进行比较,它只是获取从内存中的位置检索到的数字,如果0 是该内存中的值,则循环退出,如果它是循环继续的任何其他数字。

      假设int 在系统上是 4 个字节。给a 一个地址,假设它是0xFF00,当我们尝试评估a[0] 时,我们检索存储在内存0xFF00 中的数据值。 a[1] 将从内存 0xFF04 中检索数据,等等。您的程序仅将值分配给前 5 个内存位置,因此当我们检索这些位置之外的数据时,它们可能是从 0INT_MAX 的任何数据。如果它恰好是0,则循环退出,但如果它恰好是其他东西,则循环继续。

      您可以像这样调整您的程序以更好地查看它:

      #include <iostream>
      using namespace std;
      int main() {
          int a[5] = {1,2,3,4,5};
          int i;
          for (i = 0; a[i]; i++)
          {
              cout << "At memory address: " << &a[i]
                   << " lives the value: " << a[i] << endl;
          }
          cout << "At memory address: " << &a[i]
               << " lives the value: " << a[i]
               << ", and this is why the loop ended." << endl;
          return 0;
      }
      

      【讨论】:

      • 但是a[i] 与 0 相比!
      • @MattiVirkkunen 我想你也可以这样说,但我认为通常情况下经常发生的是TEST 指令在这里用于将寄存器与自身进行比较。 stackoverflow.com/questions/6002079/…
      • 正在执行的操作仍然是一个比较,不管它是如何实现的。而且TEST指令确实涉及将值与内部的零进行比较,否则它怎么知道它是否为零。
      • @MattiVirkkunen 好问题,我想如果我们想保持在 C++ 的范围内,我们可以说它与 0 相比,就像你说的那样简单。
      猜你喜欢
      • 2014-02-11
      • 2021-07-21
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多