【问题标题】:Is Short Circuit Evaluation guaranteed In C++ as it is in Java?在 C++ 中是否像在 Java 中一样保证短路评估?
【发布时间】:2015-07-04 03:26:56
【问题描述】:

在 Java 中,我使用

if (a != null && a.fun());

充分利用短路求值,表达式从左到右求值?

在 C++ 中,我可以这样做吗?它们是否保证可以跨不同平台和编译器移植?

if (a != 0 && a->fun());

【问题讨论】:

  • 自己尝试谷歌搜索一下,我相信使用问题中已有的关键字,您会找到答案。谷歌搜索'c++ short-circuit',你可能会发现很多直接回答你问题的结果。
  • 对于这里提出的 85% 的问题,您可能会说同样的话。
  • @dribeas 太糟糕了,你没有足够的先见之明,意识到现在排名第一的谷歌“c++短路”就是这个页面......我很高兴有人放了一个真实的在下面回答!
  • 我用谷歌搜索“是 c++ 短路了”,这个页面是第一个点击...

标签: java c++


【解决方案1】:

是的。 && 和 || C 和 C++ 中的短路;有标准保证。

另请参阅:Is short-circuiting logical operators mandated? And evaluation order?

【讨论】:

    【解决方案2】:

    是的,“内置”类型可以保证。但是,如果你重载 && 或 ||对于您自己的类型,不执行短路评估。因此,重载这些运算符被认为是一件坏事。

    【讨论】:

    • 据我所知,这是 Java 中没有运算符重载的确切原因。
    • @Thorbjørn: 可能是真的,但对我来说听起来很疯狂 - Java 可以允许运算符重载但不允许这两个运算符重载(或三元 ?: 运算符,C++ 也不会重载)。我一直认为这是因为“看起来本地的代码应该是本地的”参数,所以任何调用用户定义代码的东西都应该“看起来像”它通过显式方法调用而异常调用。
    • 疯狂在旁观者的眼中。重载有一些非常明显的缺点,即你不能相信任何东西都有你期望的行为,这足以让我认为 Java 做对了。
    • 我并不是说禁止运算符重载很疯狂。我是说出于这个原因禁止它是很疯狂的,这很容易克服,而且远没有其他合理的原因那么重要。说在 C++ 中你不能信任任何东西是夸大其词的——不过,你必须谨慎对待你的期望。 Java 程序员在 C++ 中“不可预测”的大多数东西一开始甚至不会在 Java 或 C 中编译。分配/转换是真正尴尬的。我从来没有因为看到两个对象加在一起而感到恐慌,但我很感激这并不疯狂。
    猜你喜欢
    • 2013-10-18
    • 2011-02-11
    • 1970-01-01
    • 2012-02-03
    • 2010-12-21
    • 2012-02-10
    • 2021-09-23
    相关资源
    最近更新 更多