布尔语句的求值顺序是什么?

13

2
不要误解我的意思,但是获取标准副本(在谷歌上搜索)并在那里查找可以帮助您解决大多数问题。 - David Rodríguez - dribeas
2
@David 我还好,但是我不想浪费时间在标准文件中寻找答案,而是可以在这里问问题并在最多15分钟内得到答案。这就是为什么如果我不知道应该去哪个具体的地方查找,我会提出问题,而不是通过阅读标准文件来搜索数小时。你可能会说标准文件是你应该查找的确切位置。是的,但是这个位置非常庞大,我不想花费如我所说的数小时来寻找某些东西,我宁愿在这里提问,并在更短的时间内得到好的答案。你同意这是有道理的吗? - There is nothing we can do
3
这就像有人饿了,得到了免费的鱼。这解决了眼前的问题,但不会教你如何自己捕鱼。一开始阅读标准可能很困难,但是一旦你习惯了它的组织方式,查找答案通常很快,特别是对于这种非常本地化的问题。不查看文档,我可以猜想在其中不会有超过两三个地方可以找到 && 符号。 - David Rodríguez - dribeas
6
不,这就像具有专业程序员的特质。如果有多种方式可以实现目标,应该选择更短的方式。 - There is nothing we can do
1
你用鱼的例子不太恰当。你意思是说它教不会我如何捕鱼吗?我的问题涉及到“&&”运算符而不是阅读和理解标准——我希望你同意这一点。我有两种方式来捕捉这条鱼(获得关于“&&”运算符的答案),一种是简单的方式,另一种是困难的方式。当你饿了,有人给你提供要么是已经炸好的鱼(满足你的饥饿感的答案),要么是钓鱼竿(标准工具,帮助你满足你的饥饿感),你会选择哪一个呢?你必须意识到,我没有问如何捕鱼,我只是要求一条鱼。 - There is nothing we can do
1
@David 我的建议是,当你想通过实际例子来可视化某些抽象情况时,你必须非常小心,并且必须充分理解你试图可视化的内容。 - There is nothing we can do
3个回答

19
是的。 &&||短路运算符。操作数的求值顺序已经很明确定义(从左到右)。 &&也是一个序列点。
因此,编写if( ++i && i) { }是完全可以的。
ISO C++03 (5.14/1) 表示:

&& 运算符按从左到右的顺序进行分组。两个操作数都隐式转换为类型 bool (第 4 条)。如果两个操作数都为 true,则结果为 true,否则为 false。与 & 不同,&& 保证左到右的求值:如果第一个操作数为 false,则不会对第二个操作数进行求值。

编辑:(在看到评论后)
ISO C++03 (Section 1.9/18) 表示

在每个表达式的求值中

  • a && b
  • a || b
  • a ? b : c
  • a , b

    使用这些表达式中运算符的内置含义 (5.14、5.15、5.16、5.18),在第一个表达式求值之后有一个序列点


  • 2
    有没有我可以使用的序列点参考?你似乎都知道它们。 - NullUserException
    @NullUserException:根据您的评论修改了我的答案。 - Prasoon Saurav

    12

    是的,先评估firstTrue表达式。实际上,如果firstTrue为false,则不会评估secondTrue表达式。这被称为短路运算。

    请查看此文章:http://en.wikipedia.org/wiki/Short-circuit_evaluation

    对于||也是一样的。如果||的第一个参数为true,则不会评估第二个参数。


    1

    这不是关于布尔语句的问题,而是关于这些“语句”中特定的运算符(实际上是逻辑表达式)

    内置的&&运算符(以及||)是特殊的:它们保证左侧在右侧之前被评估。它们在LHS和RHS评估之间有一个序列点。如果LHS预先确定了结果,则它们不会评估RHS。除此之外(和一些具有类似排序属性的其他运算符),没有任何关于逻辑表达式或任何其他表达式的评估顺序的保证。

    以上内容适用于内置的&&||运算符。重载的&&||运算符在任何方面都不是特殊的。


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