【问题标题】:Unexpected short circuit evaluation when used more than one logical operators in C在 C 中使用多个逻辑运算符时的意外短路评估
【发布时间】:2021-12-16 05:32:55
【问题描述】:

在 C 程序中: 1 || 0 && 0 导致 1。我认为这种行为是 OR 运算符短路了右侧的其余部分 (0 && 0),因为左侧有 1。 但 0 && 0 || 1 也会导致 1。我很困惑为什么 AND 运算符左侧的0 没有短路0 || 1 而答案不是0。 请指导我!

【问题讨论】:

  • && 的优先级高于 ||,因此这两个表达式在逻辑上是等价的。
  • 小心你的术语。通常,short circuit 表示避免计算,因此1 || (c=getchar()) != EOF 不会计算 getchar() 表达式,并且不会消耗任何字符;而0 || (c=getchar()) != EOF 总是会调用getchar()。避免评估的前者通常称为short circuiting。您引用的一些基于优先级的表达式不是。
  • Mujahid Ali,“但 0 && 0 || 1 也导致 1”与“但 (0 && 0) || 1 也导致 1”相同,所以第一个 0 做到了短路到(0 && anything) || 1,然后是0 || 1

标签: c logical-operators


【解决方案1】:

这与operator precedence有关。

逻辑 AND 运算符的优先级高于逻辑 OR 运算符 ||。所以这个:

1 || 0 && 0

解析为:

1 || (0 && 0)

还有这个:

0 && 0 || 1

解析为:

(0 && 0) || 1

所以在后一种情况下,首先评估0 && 0。这导致值 0,所以现在你有 0 || 1。 OR 的左侧为假,因此这会导致对右侧进行求值,从而导致 || 运算符的结果为 1。

【讨论】:

  • 知道了...谢谢
  • 如果您喜欢他的回答,请将其标记为已接受。 (这是一个很好的答案!)
  • @MujahidAli:您可能想阅读以下内容:What should I do when someone answers my question?
  • @TopologicalSort:对帖子发表评论时,只有帖子的作者会收到您的评论通知。如果您希望另外通知其他人,那么您必须使用 @ 并写下他们的姓名,就像我在此评论中所做的那样。在撰写评论时按“帮助”按钮以获取更多信息。
猜你喜欢
  • 2013-06-02
  • 2016-06-25
  • 1970-01-01
  • 2012-02-04
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多