评估布尔句的顺序是什么?

时间:2010-09-25 15:55:54

标签: c++ boolean

  

可能重复:
  Is short-circuiting boolean operators mandated in C/C++? And evaluation order?

是否有任何由标准或数学规则定义的布尔句子?例如:

if (firstTrue && secondTrue)
{
}

我可以确定首先检查firstTrue吗?

3 个答案:

答案 0 :(得分:13)

是。 &&||short circuiting operators。操作数的评估顺序是明确定义的(从左到右)。

&&也是一个序列点 所以写if( ++i && i) { }完全没问题。

ISO C ++ 03(5.14/1)说:

  

&&操作员组从左到右。操作数都隐式转换为bool类型(第4节)。 如果两个操作数均为true,则结果为true,否则为false。不像&,&&保证从左到右评估:如果第一个操作数为假,则不评估第二个操作数

编辑 :(看到评论后)

ISO C ++ 03(第1.9/18部分)说

  

在每个表达式的评估中

     

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

         

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

  • 答案 1 :(得分:7)

    是firstTrue将首先评估。实际上,如果firstTrue为false,则甚至不会评估secondTrue。这称为短路。

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

    ||也是如此。如果||的第一个参数为真,则不会评估第二个参数。

    答案 2 :(得分:2)

    这不是布尔句子。它是关于这些“句子”中的特定运算符(实际上是逻辑表达式)

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

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