"бросить код выражения" Что возвращает d> 1e7? throw std :: overflow_error ("too big"): d; жадный? - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу узнать все об исключениях в c ++, и я нашел этот код здесь , чтобы выдать его, потому что мой OOM killer на Linux не выполняет завершение. Я просто не понимаю, что конкретно делает return d > 1e7 ? throw std::overflow_error("too big") : d;:

#include <iostream>
#include <stdexcept>

double f(double d)
{
    return d > 1e7 ? throw std::overflow_error("too big") : d; //what is going on here?
}
int main()
{
    try {
        std::cout << f(1e10) << '\n';
    } catch (const std::overflow_error& e) {
        std::cout << e.what() << '\n'; // information from length_error printed
    }
    return 0;
}

1 Ответ

3 голосов
/ 26 февраля 2020

ОК, давайте посмотрим на это шаг за шагом:

Я полагаю, что ваше замешательство происходит из одного из двух мест:

d > 1e7

или синтаксис:

a ? b : c;

Итак, для начала, 1e7 является формой научной c нотации, в основном 1 раз 10 в 7th степени, или другими словами 10000000

Так d > 1e7 в основном совпадает с записью: d > 10000000.0

Следующий бит называется условным оператором или «троичным оператором» . это приходит в форме a ? b : c. В основном это означает, что «если a равно true, то результатом выражения будет b, в противном случае, результатом выражения будет c.

Итак, в итоге, мы можем переписать ваш оператор return следующим образом:

if(d > 10000000.0) {
    throw std::overflow_error("too big");
} else {
    return d;
}

NOTE Как правило, выражения b и c троичного оператора должны быть преобразованы во взаимный тип, но создание исключения является одним из ... исключений этого правила, поскольку оно перенаправляет поток управления на обработчик и, таким образом, вообще ничего не возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...