我正在使用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.numerator
或cfraction.denominator
等于0,我的程序会崩溃。
有人可以通过告诉我的代码到底出现什么问题来帮助我吗?
更新 - 解决了,必须检查gcd是否为零。感谢所有回答的人。
答案 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);
然而,这可能是危险的,因为它隐藏了代码中的一些问题(除以零几乎总是一个问题)。