2

我开始学习 C++ 编程并且有一个关于错误处理的问题。

我编写了一个从函数计算 x 的代码ax+b=0(所以我必须除以-ba。这些值由用户通过cin >>

如果我除以 0,我得到-int我的输出。是否有可能捕获错误(例如在if声明中)?

我知道除以零是不可能的,而且我也知道如果它不检查用户的输入(例如if ((a != 0)){calculate}),它不会是一个程序的好行为。问题是我想知道它是否/如何工作来捕获这个错误;-) 它是否取决于硬件、操作系统或编译器?

我的老师帮不了我;)

顺便提一句。我在 Mac OS X 10.8.2 上使用 Eclipse Juno IDE for C/C++

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    float a, b, x;   //float da Kommazahlen erwartet werden
    cout << "ax + b = 0" << '\n'<< endl;
    cout << "Bitte geben Sie einen Wert für a ein:" << endl;
    cin >> a;
    cout << "Bitte geben Sie einen Wert für b ein:" << endl;
    cin >> b;

    x = -b/a;
    cout << "Ergebnis:" << x << endl;

    if (x == #INF )
    {
        cout << "Du bist a Volldepp - durch Null kann man nicht teilen!" << endl;
    }

    return 0;
}
4

6 回答 6

7

是的:

在 C++03 中

 if ((x == +std::numeric_limits<float>::infinity()) || 
     (x == -std::numeric_limits<float>::infinity())
    )

在 C++11 中

 if (std::isinf(x))
于 2013-03-07T17:37:38.450 回答
4

a == 0在尝试除法之前检查是否:

if (a == 0) {
    std::cerr << "I'm not even going to try\n";
    return 1;
} else {
    std::cout << "-b/a = " << (-b/a) << std::endl;
}

不过,这可能仍然会产生inf一些非常小的数字。

(请注意,一般来说,检查 afloat是否等于某个值是不可靠的,因为舍入错误,但对于零是可以的。)

于 2013-03-07T17:00:07.323 回答
1

您应该在计算之前检查输入的正确性,而不是之后:

if ( a == 0 ) {
 if ( b == 0 )
   cout << "equation valid for all x" << endl;
 else
   cout << "no x satisfies this equation" << endl;
}
于 2013-03-07T17:00:46.707 回答
1

是的,处理这种情况的最佳方法是 a==0 条件。除以零也不例外,它是在硬件级别处理的。硬件向操作系统和操作系统发送中断到您的应用程序,从而使其崩溃。可以用信号捕获:

#include <csignal>
#include <iostream>

using namespace std;

void handler(int nVal) 
{
    cout << "Divid By Zero Error" << endl;
}

int main() 
{
    signal(SIGFPE, handler);
    int nVal = 1/0;
}
于 2013-03-07T17:15:07.397 回答
1

我回应其他海报说你应该检查你的论点,但还有另一种选择:http ://en.cppreference.com/w/cpp/numeric/math/math_errhandling

根据该链接,在 C++11 中,您可以设置 a#define以使其在除以零时抛出 type 的异常FE_DIVBYZERO。但是该页面上的文档不清楚,因此请检查您自己的编译器是否支持这一点。

于 2013-03-07T17:30:04.203 回答
0

您无法捕获异常,C但可以通过检查值来避免它。

试试这样,它会帮助你

if (a == 0) {
  x = 0;
} else {
  x = b/a;
}
于 2013-03-07T17:00:44.940 回答