在C++中,短路求值是否像Java一样得到保证?

28

在Java中,我使用

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

利用短路求值并从左到右评估表达式,能否在C++中实现相同的功能?它们是否保证可以跨不同平台和编译器进行移植?

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

5
尝试自己谷歌一下,相信通过问题中提供的关键词,您会找到答案。搜索“c++ 短路运算”,您可能会发现很多直接回答您问题的结果。 - David Rodríguez - dribeas
7
在这里问的问题中,大约有85%的问题你可能会说出同样的话。 - John Dibling
5
很遗憾你没有预见到现在“C++ 短路”的谷歌搜索排名第一的是这个页面......我很高兴有人在下面给出了真正的答案! - C S
4
我谷歌搜索了“C++是否支持短路求值”,这个页面是搜索结果中的第一个链接... - digit plumber
这是我在谷歌搜索问题时找到的第一篇帖子。我认为SO帖子的一个重要作用是使谷歌搜索更加容易,因此如果不同措辞的类似问题可以让人们的生活更轻松,我不介意出现一些重复。 - Superziyi
2个回答

42

是的,对于“内置”类型是有保证的。然而,如果你为自己的类型重载了 && 或 ||,那么短路求值就不会被执行。因此,重载这些运算符被认为是一件坏事。


1
据我所知,这正是Java不支持运算符重载的确切原因。 - Thorbjørn Ravn Andersen
@Thorbjørn: 可能是真的,但对我来说听起来很疯狂 - Java本来可以允许操作符重载,但不允许这两个运算符的重载(或者三元条件运算符?:,就像C++一样也不重载)。我一直认为这是因为“看起来本地的代码应该是本地的”的论点,即调用用户定义代码的任何内容都应该“看起来”像在外部调用,具有显式的方法调用。 - Steve Jessop
2
疯狂在于看待事物的角度。重载具有一些非常明显的缺点,即您不能相信任何东西都具有您期望的行为,这让我认为Java做得很对。 - Thorbjørn Ravn Andersen
7
我并不是在说禁止运算符重载是疯狂的。我是说,因为那个原因而禁止它是疯狂的,因为那个原因容易克服,而且远不及其他可行原因重要。说在 C++ 中什么都不能信任是夸张的 - 你需要谨慎地对待你期望的事情。大多数在 C++ 中被 Java 程序员认为是“不可预测”的事情,在 Java 或 C 中甚至无法编译。赋值/转换才是真正棘手的问题。我从未因为看到两个对象相加而感到惊慌,但我欣赏这种心态。 - Steve Jessop

10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接