【问题标题】:OR and AND operation in CC中的OR和AND运算
【发布时间】:2011-06-25 06:56:16
【问题描述】:

我对下面的程序有疑问。

int main()
{
    int i = -3,j = 2, k = 0,m;
    m = ++i || ++j && ++k;
    printf("%d %d %d %d\n", i, j, k, m);
    return 0;
}

我得到的输出是-2 2 0 1

在 OR 运算中,如果第一个值为真,那么它不会评估第二个值,因此 i = -2j =2。 然后是 AND 操作。它将检查两个值是否为真。所以如果k = 1 然后m = 1。 所以输出应该是-2 2 1 1。我运行并检查并得到输出为-2 2 0 1,但我不明白如何。

【问题讨论】:

  • @Mikola&Michael:谢谢你让我理解。

标签: c logical-operators


【解决方案1】:

您使用了短路或。由于 ++i 的计算结果为 -2,而不是 0,因此它会短路并且不会计算表达式的其余部分。结果,j 或 k 都不会增加。

还要注意短路运算符 ||和 &&, 是左结合的并且 ||优先级高于 &&。因此,||首先评估,如果左侧评估为真,则提前出局,而如果左侧评估为假,则 && 提前出局。

编辑:修正了解释优先级的错误。

【讨论】:

  • 我正盯着代码看,我不明白为什么m = 1 而不是-2,这是++i 的结果。
  • 我不认为1 是有保证的,只有非零。 m 被分配二进制运算的“布尔”结果。
  • @Ben Alpert:不,||是 boolean 或(与 | 不同)。它将其参数转换为布尔类型(即 0/1 int)并返回它们。如果您为其操作数之一指定任何非零整数,它将返回 1。否则,事情会一团糟(例如,想想如果您使用 AND 执行此操作会发生什么?假设一个值为 2另一个是 4,你会得到 0!)
  • 啊,我把我的语言弄混了,我想它会返回第一个参数。 FWIW,JavaScript 中的2 && 4 给出4
  • 逻辑 OR 和逻辑 AND 的关联性无关紧要,因为它们的优先级不同。逻辑 AND 的优先级高于逻辑 OR。_That_ 是不计算 ++k 的原因。
【解决方案2】:

|| 之后没有计算任何内容,因为表达式 ++i 的结果非零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多