【问题标题】:Multiple logical operators in one line of code一行代码中的多个逻辑运算符
【发布时间】:2016-05-24 18:19:50
【问题描述】:

我在 Stack Overflow 上搜索这个问题的答案,但我没有找到确切的答案。我想出了这个代码。我知道操作员应该如何工作,但在这类问题中我不理解他们。例如,在第一种情况下,如果我使用 ++y 和 ++z,z 和 y 怎么可能仍然是 1?

#include <stdio.h>

int main(void) {
    int x, y, z;

    x = y = z = 1;
    ++x || ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = 1;
    ++x && ++y || ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = 1;
    ++x && ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x && ++y || ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x || ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x && ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    return 0;
}

我得到的结果:

x = 2 y = 1 z = 1
x = 2 y = 2 z = 1
x = 2 y = 2 z = 2
x = 0 y = -1 z = 0
x = 0 y = 0 z = -1
x = 0 y = -1 z = -1

【问题讨论】:

标签: c operators logical-operators


【解决方案1】:

这是对逻辑表达式求值的结果:一旦确定表达式为假(或真),其余的运算符就不再求值。例如:

++x || ++y && ++z;

由于x 为一,因此表达式将独立于z 或y 为真,因此不再执行++y 和++z。

【讨论】:

  • 所以?这并不意味着 ++x &amp;&amp; ++z 将被评估首先。
  • 看看你在++x &amp;&amp; ++y || ++z;得到了什么;-)
  • 第二个例子:x = y = z = 1; ++x &amp;&amp; ++y || ++z;——因为++x是真的,x是2并且&amp;&amp;的RHS被评估;因为++y 为真,y 为 2,|| 的 RHS 没有得到评估。所以,输出是x = 2, y = 2, z = 1。
  • 乔纳森,需要注意的是:x 上的++ 将始终执行。如果 x 是 0,现在将是 true (1)。
  • Ziga,请读一本关于 C 的书。那里都有详细说明。仅供参考:是的,只有0 表示false。
【解决方案2】:

由于优先级规则,第一个示例中的表达式等同于( && 的优先级高于 || ):

++x || ( ++y && ++z ) ;

所以我们只剩下运算符|| 及其两个操作数++x 和( ++y &amp;&amp; ++z )。此运算符从左到右进行评估,因此首先评估 ++x。 但是这个运算符也会短路,这意味着如果第一个操作数的计算结果为真,就像在这种情况下 ++x 所做的那样,第二个操作数 ( ++y &amp;&amp; ++z ) 将不会被计算。

【讨论】:

  • 你能解释一下第二种情况吗?
  • @ŽigaGazvoda 第二个示例只是第一个示例的变体。如果你理解一个,那么你必须另一个。
  • Ziga,你现在可以自己解释了。使用运算符优先级和关联性查找页面。
【解决方案3】:

原因是你使用了||和&&。

&& 和 ||运算符短路计算,也就是说,对于 &&,如果第一个操作数的计算结果为 false,则永远不会计算第二个操作数,因为结果总是为 false。同样,对于 ||如果第一个操作数的结果为真,则从不操作第二个操作数。

单和号“&”可以说是“按位与”运算符,双和号“&&”可以说是“逻辑与”运算符。

例如,在这一行中: ++x || ++y && ++z; x 为 1,因此 ++x 的布尔值为真。因为你用了||语句“++y && ++z”根本没有运行,y和z的值为1。

如果你将使用 & 和 |该值将增加到 2。

【讨论】:

  • 我不明白你的回答。 “不遵守运营商规则”读起来像是语法问题。为什么要引入位运算符?与这里的逻辑运算符无关。
  • “短路”这个词很好用。但经营者始终遵守规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2019-08-20
  • 2020-12-20
相关资源
最近更新 更多