【问题标题】:The value of iterator not updating inside an if statement in a for loop迭代器的值未在 for 循环中的 if 语句内更新
【发布时间】:2020-08-28 18:23:06
【问题描述】:

我想知道为什么当 i == n-1 时 i 的值没有更新为 i=0,正如我在代码中所写的那样。 bool 标志只是用来检查 if 语句是否正在呈现(它是)。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n, ans = 0;
        scanf("%d", &n);
        int s[n];
        bool flag = false;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &s[i]);
        }
        for (int i = 0; i < n; i++)
        {
            s[i] -= 1;
            if (s[i] < 0)
                break;
            ans++;
            if (i == (n - 1))
            {
                i=0;
                flag = true;
            }
        }
        printf("\n%d\n", ans);
        printf("%d", flag);
    }

    return 0;
}

【问题讨论】:

标签: c++ arrays for-loop if-statement


【解决方案1】:

你怎么知道它没有做你想做的事。我运行它并得到了这个:

$ ./foo 1 2 3 4

5 1 $

最终值 (1) 为真。所以看起来它正在对我这样做。

但是,这是非常糟糕的代码。像这样在循环中使用迭代器变量是一种非常糟糕的做法。那会咬你的。此外,您不会回到 0 - 您将回到 1,因为它所做的下一件事是使用您的 i++ 递增变量。因此,您的 if 语句将 i 设置为 0,而您的 for 循环将其设置为 1。

但这很奇怪。如果您需要多次运行循环,则将其包装在更大的循环中。


其他人对 printf 发表了评论。就个人而言,我不同意他们的看法。有时 printf 是完全有效的。然而——你将它用于如此简单、未格式化的东西的方式并不是其中之一。

我把最后一个 printf 改成了这个:

cout << "Flag (raw): " << flag << ". Which means: " << (flag ? "True" : "False") << endl;

输出是这样的:

Flag (raw): 1. Which means: True

如你所见 -- 是 1,不是 0,所以是真的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多