C ++程序崩溃,没有错误

时间:2016-05-26 11:36:08

标签: c++

我正在使用C ++中的一个分数类,我遇到了这个代码块的问题:

ostream& operator << (ostream &out , Fraction &cfraction)
{
    int gcd = normalize (cfraction) ;
    cfraction.numerator /= gcd ;
    cfraction.denominator /= gcd ;

  try
    {
        if (cfraction.denominator < 0)
        {
            cfraction.numerator *= -1 ;
            cfraction.denominator *= -1 ;
        }
        //needs editing

        if (cfraction.denominator == 0)
            throw "Not defined" ;

        if (cfraction.numerator == 0 && cfraction.denominator != 0)
            out << cfraction.numerator ;

        if (cfraction.denominator == 1)
        {
            out << cfraction.numerator ;
        }

        else
            out << cfraction.numerator << "/" << cfraction.denominator ;
    }

    catch (const char* error)
    {
        cerr << "ERROR: " << error << "  " ;
    }

    return out ;
}

如果cfraction.numeratorcfraction.denominator等于0,我的程序会崩溃。

有人可以通过告诉我的代码到底出现什么问题来帮助我吗?

更新 - 解决了,必须检查gcd是否为零。感谢所有回答的人。

1 个答案:

答案 0 :(得分:3)

如果除以零,程序崩溃。这是它能做的最好的事情,因为除以零不会产生有意义的结果。你唯一能想到的就是在分割之前检查零,例如:

int a = 1;
int b = 0;
assert( b != 0 );
int c = a/b;

通常,您希望将assert替换为更合理的错误处理。在一些罕见的情况下,通过在分割之前添加一些epsilon来避免除零甚至可能是有意义的。 E.g。

double d = 1.0;
double e = 0.0;
double eps = 1.0e-10;
double f = d/(e + eps);

然而,这可能是危险的,因为它隐藏了代码中的一些问题(除以零几乎总是一个问题)。