我所做的代码是为了解决以下问题。然而,代码的逻辑是错误的,我作为一个好新手无法想象有什么不对。 在编译之后,'sum'的结果总是为0,如果我为任何数字更改'sum'的初始化,那么无论是什么数字都显示为'sum'的答案。
如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.
查找低于1000的3或5的所有倍数的总和。
#include <iostream>
using std::cout;
using std::endl;
int main()
{
long sum = 0;
for( long i; i < 1000; ++i )
{
if (( i % 3 == 0 ) || ( i % 5 == 0 ))
{
sum = sum + i;
}
}
cout << "The sum is: " << sum << endl;
return 0;
}
答案 0 :(得分:1)
您需要在循环中初始化i
:
for (long i = 0; i < 1000; ++i )
实际上,我可能是循环顶部大于0的随机数,结果是循环永远不会被执行。
答案 1 :(得分:0)
您需要将i
初始化为零,否则i
的值将是内存中发生的任何值。在这种情况下,它是&gt; 1000。
for (long i = 0; i < 1000; ++i)
另外,我学到了一个很好的技巧。使用ii
作为索引变量。在代码中查找ii
比在i
更容易。
答案 2 :(得分:0)
你忘了在你的循环中设置i = O,所以循环不会迭代。
答案 3 :(得分:-1)
以上所有答案都是正确的 - 您需要将i
设置为0
。您可能感兴趣的是访问未初始化的变量是一个“未定义的行为”(UB),而现代编译器实际上非常适合查找UB并使用它们来优化代码。例如,带有-O2
的GCC 5.2(已启用优化)将为您的代码生成相同的程序集,并为 所有的循环生成 >无论i
地址的内存中发生了什么。
尝试将此代码放入(为方便起见,您的代码附加#if
)this online disassembler
#include <iostream>
using std::cout;
using std::endl;
int main()
{
long sum = 0;
#if 1
for (long i; i < 1000; ++i)
{
if ((i % 3 == 0) || (i % 5 == 0))
{
sum = sum + i;
}
}
#endif
cout << "The sum is: " << sum << endl;
return 0;
}
将-O2
标志添加到右上角的编译器选项,并尝试将#if 1
更改为#if 0
,并观察反汇编与编译器完全切断循环的意义相同。 / p>