程序不起作用,添加print语句有效,为什么?

时间:2015-09-09 00:51:22

标签: c++

我们必须迭代地和递归地编写一个gcd计算器,并且我们得到一个测试脚本,我的程序失败2/10测试(gcd_iterative(1000, 48) = 1000gcd_iterative(48, 24) = 48)。所以我用print语句向我的程序展示了它并且它起作用了。我一次开始删除1个语句,并且有1行,如果我删除该语句则会产生错误的答案。为什么会发生这种情况,我该如何解决?

using namespace std;

#include <sstream>
#include <string>
#include <iostream>
#include <cstdlib>
int gcd_iterative(int m, int n)
{
    int r;
    while(r != 0)
    {
        r = m % n;
        m = n;
        n = r;
    }
    return m;
}

int gcd_recursive(int m, int n)
{
    if(n == 0)
    {
        return m;
    }
    else
    {
        return gcd_recursive(n, m % n);
    }
}

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        cerr << "Usage: " << argv[0] << " <integer m> <integer n>" << endl;
        return 1;
    }
    istringstream iss;
    iss.str(argv[1]);
    int m;
    if (!(iss >> m))
    {
        cerr << "Error: The first argument is not a valid integer." << endl;
        return 1;
    }
    iss.clear();
    iss.str(argv[2]);
    int n;
    if (!(iss >> n))
    {
        cerr << "Error: The second argument is not a valid integer." << endl;
        return 1;
    }
    cout << "" << endl;
    cout << "Iterative: gcd(" << m << ", " << n << ") = " << gcd_iterative(m, n) << endl;
    cout << "Recursive: gcd(" << m << ", " << n << ") = " << gcd_recursive(m, n) << endl;
    return 0;
}

print语句为cout << "" << endl;

2 个答案:

答案 0 :(得分:3)

问题在于:

int r;
while(r != 0)
{
    r = m % n;
    m = n;
    n = r;
}
return m;

r的值未初始化为任何值,因此如果初始值为零,则算法将在while循环上终止,并且仅返回m的值。

不需要C ++将堆栈变量的值初始化为任何默认值或其他任何值,因此r变量中的值是前一个函数调用留在堆栈中的值。似乎恰好cout << endl;r的正确堆栈位置留下非零值以具有非零值,并且实际运行算法。 (请注意,如果C ++确实提供了默认值,那么默认值大概可能为零,因此您仍然需要初始化)。

通常,您应该将堆栈变量的默认值初始化为安全值,而不是依赖于它们的默认值。因此,在这种情况下,修复是在第一次声明时将r设置为任何非零值。例如。 int r = 1;

旁注:在C / C ++中,任何整数值都可以用作布尔值,零是false,因此您的while条件可以简化为while(r)而不是{{ 1}};就while循环而言,这些是完全等效的表达式。

答案 1 :(得分:0)

当程序的结果发生这样的变化时,很可能你忘记了一些变量。在你的情况下,你看起来忘了初始化r:

int r;
while(r != 0)

&#39; R&#39;将得到一个任意值(无论发生在CPU寄存器中)。很可能没有print语句,r为零,因此while()循环永远不会运行。您希望显式设置为非零值。