【问题标题】:"throw expression code" What does return d > 1e7 ? throw std::overflow_error("too big") : d; mean?“抛出表达式代码” return d > 1e7 是什么?抛出 std::overflow_error("太大") : d;意思是?
【发布时间】:2020-06-09 15:30:53
【问题描述】:

我想了解 C++ 中的所有异常,我找到了这段代码 here 发出一些,因为我在 Linux 上的 OOM 杀手没有发出终止。 我只是不明白 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;
}

【问题讨论】:

  • 听起来你可以使用good C++ book
  • 有什么不明白的?在try 块内调用f() 函数,如果d 参数无效,则该函数将引发std::overflow_error 异常,然后catch 块将捕获该异常。您将不得不更具体地说明您对此不了解的具体内容。
  • 你问了一个非常相似的question。恕我直言,你应该提到这一点并解释这个有何不同。为什么您在那里得到的答案不适用于这里?我这里又有同样的评论:为什么你希望程序在捕获异常时终止?
  • 可能的搜索词:三元运算符。
  • @user4581301 1e710000000.0 的另一种写法。你真的需要从good book 以结构化的方式学习 C++。如果你看到一些你不知道的新东西,首先努力搜索以前的问题,如果你没有找到任何东西,具体询问那件事,例如。 “这段代码中的1e7 是什么意思?”。例如,当我搜索c++ 1e7 时,我得到的第二个链接是this question

标签: c++ c++11


【解决方案1】:

好的,我们一步一步看:

我想你的困惑来自两个地方之一:

d > 1e7

或者,语法:

a ? b : c;

所以对于初学者来说,1e7 是一种科学记数法,基本上是 1 乘以 107th 幂,或者换句话说 10000000

所以d &gt; 1e7和写法基本一样:d &gt; 10000000.0

下一位称为条件运算符,或"ternary operator"。它以a ? b : c 的形式出现。基本上它的意思是“如果atrue,那么表达式的结果是b,否则,表达式的结果是c

总而言之,我们可以像这样重写您的return 语句:

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

注意 通常情况下,三元运算符表达式的 bc 都必须可转换为相互类型,但抛出异常是其中一种......异常规则,因为它将控制流转移到处理程序,因此根本不返回任何内容。

【讨论】:

  • 谢谢,这真的很有帮助!三元运算符使代码非常精简。
  • @Ivanovic 没问题。另外,我看到了你关于 OOM 杀手的另一个问题。如您所知,Linux 在设计上基本上永远不会抛出std::bad_alloc,因为它使用了一种称为“过度配置”的分配策略。这意味着即使没有足够的 RAM,分配也总是被“批准”。当您尝试实际触摸它无法提供的RAM时(由于没有足够的),然后,它将导致错误。
  • 感谢您的提示。如果我像 f.e. 那样关闭交换,系统会在它进入“过度配置”范围之前冻结。用#swapoff -a。我猜 overflow_error 与 std::bad_alloc 错误不同——但至少我可以执行 catch 语句。
  • @EvanTeran 好吧,取决于过度使用设置。和流程限制。
  • @Deduplicator 当然,这很公平。虽然我承认我从未见过 Linux 实际上无法亲自分配内存。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 2013-07-16
  • 2015-03-16
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多