为啥我得到 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。
因此,值应为1
、10
、100
、1000
、10000
但是,我收到了10
、110
、1110
、11110
int main()
for (std::size_t i = 1; i <= 10000; i += 1)
i *= 10;
std::cout << i << " \n";
【问题讨论】:
代码执行i += 1
和i *= 10
。
除了在循环的每次迭代之后乘以 10 之外,您还加了一个,所以每次迭代之前 i
的值是 1、11、111、1111,...顺便说一句。与使用另一个足够大的整数类型相比,size_t
的使用在这里没有任何改变。在这种情况下,将 std::size_t
替换为 int
或 unsigned long long
将得到完全相同的输出。
试着拿起笔和纸,想象自己是一台计算机,在每次迭代中写下i
和i *= 10
的值。不需要做10000次迭代,3次之后你就会清楚的看到一个点。
考虑使用调试器。您会立即看到问题所在
我同意,如果您有像 Visual Studio 甚至 gdb 中的调试器,您会在比发布问题更短的时间内看到错误。前提是您知道让调试器一次执行 1 行而不是仅仅运行程序完成的关键是什么。此外,您还必须查看每一步的变量。
【参考方案1】:
您的循环将i
乘以10
之前 显示i
,因此您永远不会看到1
打印出来。然后你也递增 i
乘以1
之后 乘以10
,在这种情况下你根本不应该这样做。
让我们来看看逻辑:
在第一次迭代中,i
从 1
开始,并乘以 10
,因此打印出 10
,然后将 i
递增 1
。
在第二次迭代中,i
是 11
,乘以 10
,所以打印了 110
,然后 i
增加了 1
。
在第 3 次迭代中,i
是 111
,它乘以 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 等?的主要内容,如果未能解决你的问题,请参考以下文章