【问题标题】:Why am I getting 1, 10, 110, 1110 etc. rather than 1, 10, 100, 1000 etc.?为什么我得到 1、10、110、1110 等而不是 1、10、100、1000 等?
【发布时间】:2021-03-30 18:46:27
【问题描述】:

我是 C++ 初学者。

我正在尝试使用std::size_t 创建一个循环,但我不确定我是否正确使用它。变量 (i) 应该从 1 开始并迭代哪个 i <= 10000。每次迭代,i 应该乘以 10。

因此,值应为110100100010000

但是,我收到了10110111011110

int main()
{
    for (std::size_t i = 1; i <= 10000; i += 1)
    {
        i *= 10;
        std::cout << i << " \n";
    }
}

【问题讨论】:

  • 代码执行i += 1i *= 10
  • 除了在循环的每次迭代之后乘以 10 之外,您还加了一个,所以每次迭代之前 i 的值是 1、11、111、1111,...顺便说一句。与使用另一个足够大的整数类型相比,size_t 的使用在这里没有任何改变。在这种情况下,将 std::size_t 替换为 intunsigned long long 将得到完全相同的输出。
  • 试着拿起笔和纸,想象自己是一台计算机,在每次迭代中写下ii *= 10 的值。不需要做10000次迭代,3次之后你就会清楚的看到一个点。
  • 考虑使用调试器。您会立即看到问题所在
  • 我同意,如果您有像 Visual Studio 甚至 gdb 中的调试器,您会在比发布问题更短的时间内看到错误。前提是您知道让调试器一次执行 1 行而不是仅仅运行程序完成的关键是什么。此外,您还必须查看每一步的变量。

标签: c++ iteration


【解决方案1】:

您的循环将i 乘以10 之前 显示i,因此您永远不会看到1 打印出来。然后你也递增 i 乘以1 之后 乘以10,在这种情况下你根本不应该这样做。

让我们来看看逻辑:

  • 在第一次迭代中,i1 开始,并乘以 10,因此打印出 10,然后将 i 递增 1

  • 在第二次迭代中,i11,乘以 10,所以打印了 110,然后 i 增加了 1

  • 在第 3 次迭代中,i111,它乘以 10,所以打印了 1110,然后 i 增加了 1

等等。

要解决这个问题,您需要完全摆脱i += 1,并将i *= 10 移出循环body 并进入循环counter,例如:

int main()
{
    for(std::size_t i = 1; i <= 10000; i *= 10)
    {
        std::cout << i << " \n";
    }
}

Demo

【讨论】:

    【解决方案2】:

    值应为 1、10、100、1000、10000

    那么你想要这样的东西:

    for (std::size_t i = 1; i <= 10000; i *= 10)
        std::cout << i << " \n";
    

    【讨论】:

    • 虽然答案是正确的,但我觉得它不完整。使用原始代码添加对问题的解释将有助于完成此答案。
    • 对于问题的 cmets 中的问题已经有两个完美的解释。我只是解决了问题。
    • @Blindy 关于您的第一条评论,本网站的性质意味着答案含蓄地提示批评。
    • 评论随时可能消失。在这种情况下,一个好的答案应该是相当完整的,这意味着即使它存在于 cmets 中也要添加解释......
    • @Blindy 似乎您希望用户对帖子保留他们的 cmets,除非帖子作者明确要求他们。这不是这个网站的工作方式。帖子作者是否要求反馈、cmets 或意见无关紧要。整个网站是围绕同行评审构建的。您可以不同意反馈,但不能因为没有提示而简单地忽略它。
    【解决方案3】:

    虽然其他答案正确地解释了您的问题是什么,但如果您使用调试器逐步执行它,您可以在不在这里询问的情况下弄清楚这一点。

    以下是关于在 Linux 和 Windows 上调试的两个 Stackoverflow 问题:

    (这些是关于调试 C 程序的,但同样的工具和环境也可用于调试 C++ 程序。)

    如果您要调试程序,逐步执行各个命令,您会注意到@RemyLebeau describes - 您自己的更改顺序。

    此外,为了将来参考 - 大多数 StackOverflow 用户都希望提问者进行“尽职调查”,在向我们寻求解决方案之前做出合理的努力来找出他们的问题。既然您了解了调试器 - 请在询问“为什么我的程序没有按照我的预期执行”之前使用它。

    【讨论】:

    • 这是迄今为止最好的答案。
    • @SergeyA:嗯,它要么给出这个答案,要么标记为任何其他关于“为什么我的程序没有按照我想要的方式运行?”的问题。
    猜你喜欢
    • 2016-05-24
    • 2014-01-08
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2014-03-19
    • 2015-08-28
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多