为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?

Posted

技术标签:

【中文标题】为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?【英文标题】: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 行而不是仅仅运行程序完成的关键是什么。此外,您还必须查看每一步的变量。 【参考方案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 上调试的两个 *** 问题:

How to debug a C program How do you debug a C program on Windows?

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

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

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

【讨论】:

这是迄今为止最好的答案。 @SergeyA:嗯,它要么给出这个答案,要么标记为任何其他关于“为什么我的程序没有按照我想要的方式运行?”的问题。

以上是关于为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?的主要内容,如果未能解决你的问题,请参考以下文章

UTF-8

Perl 和契约式设计

HCIA笔记-----第二天

表连接在哪里

为啥我得到 null 而不是 Map 对象?如何解决这个问题?

(Java) 为啥 Math.ceil(15/10) 是 1.0 而不是 2.0?