评估布尔语句的顺序是啥? [复制]

Posted

技术标签:

【中文标题】评估布尔语句的顺序是啥? [复制]【英文标题】:What is the order of evaluating boolean sentence? [duplicate]评估布尔语句的顺序是什么? [复制] 【发布时间】:2011-04-17 04:56:09 【问题描述】:

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

是否有任何由标准或数学规则定义的评估布尔语句的顺序?例如:

if (firstTrue && secondTrue)


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

【问题讨论】:

不要太苛刻,但是获取标准的副本(在谷歌中搜索)并在那里查找可以帮助您解决大部分问题。 @David 我很好,但上帝知道我可以在这里问多久,而不是花费天知道我可以在最多 15 分钟内得到答案。这就是为什么如果我不知道我想寻找的确切位置,我会提出问题,而不是通过阅读标准来搜索几个小时。您可能会说,但标准是您应该查看的确切位置。是的,但是这个地方太大了,我不想花费数小时来寻找我宁愿在这里提问并拥有的东西在更短的时间内作为很好的答案。你同意这确实有意义吗? 这就像有人饿了,却得到了免费的鱼。它解决了当前的问题,但不会教你如何自己钓鱼。该标准起初很难阅读,但在您习惯了它的组织之后,浏览答案通常很快。特别是这类非常本地化的问题。不检查,我可以猜测在文档中可以找到&& 令牌的地方不超过两三个。 @David 不,这就像具有专业程序员的特征。如果要实现目标有很长的路要走,那就选择较短的。 continue 你用鱼的例子是不合适的。你的意思是它不会教我如何捕鱼?我的鱼是操作员 && 不是如何阅读和理解标准 - 我希望你同意这一点。我有两种选择来捕捉这条鱼(得到我关于 && 运算符的问题的答案),无论是简单的方式还是困难的方式。当你饿了,有人会给你准备好的炸鱼(回应你的饥饿感)或钓鱼竿(帮助你满足饥饿感的标准),你更喜欢哪一种?你一定知道,我不是问怎么钓鱼,我只是问了一条鱼。 【参考方案1】:

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

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

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

&& 运算符从左到右分组。操作数都被隐式转换为 bool 类型(第 4 条)。 如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数

编辑:(看到评论后)

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

在每个表达式的评估中

a && b 一个|| b 一个? b : c a , b

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

【讨论】:

有我可以使用的序列点的参考吗?你似乎都认识他们。 @NullUserException :根据您的评论编辑了我的答案。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于评估布尔语句的顺序是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL JOIN 的评估顺序是啥?

Java中评估顺序的规则是啥?

在红移中评估的顺序是啥

“?”是啥意思?和“:”在布尔语句中做啥? [复制]

是否保证不会对 if 语句进行不必要的评估? [复制]

如何在 VBA 中评估 Or 语句?