【问题标题】:"And" and "Or" operators in conditionals in C [duplicate]C中条件句中的“与”和“或”运算符[重复]
【发布时间】:2017-05-08 05:44:59
【问题描述】:

我总是想知道一些事情,但在其他地方找不到答案。如果我有这段代码:

if ((cond1) &&(cond2) && (cond 3) && (cond 4))
 {
       // do something
 }

假设第一个条件为假,那么我的程序也会验证其他条件,还是跳过验证它们?

如果我有

if ((cond1) ||(cond2) || (cond 3) || (cond 4))
 {
       // do something
 }

如果 cond 1 为真,我的程序会立即执行 if 部分还是继续验证其他条件?

【问题讨论】:

  • 谷歌“短路评估”
  • 您的 C 书籍或任何在线资源对 ||&& 运算符有什么看法?有什么不清楚的地方?
  • 是的,如果您有false && ...true || ...,则将跳过其余条件。它叫short circuiting
  • 在调试器中运行时,经验测试向您展示了什么?

标签: c optimization logical-operators evaluation logical-and


【解决方案1】:

引用C11 标准,第 §6.5.13 章,逻辑与运算符强调我的

与按位二进制& 运算符不同,&& 运算符保证从左到右的评估; 如果对第二个操作数求值,则在求值之间存在一个序列点 第一个和第二个操作数。 如果第一个操作数比较等于 0,则第二个 不计算操作数。

因此,如果第一个条件(LHS 操作数)的计算结果为 false,则后面的条件,即 && 的 RHS 操作数将计算。 p>

类似地(讽刺的是,),对于逻辑“或”运算符,

与按位| 运算符不同,|| 运算符保证从左到右的评估;如果 第二个操作数被求值,第一个求值之间有一个序列点 和第二个操作数。 如果第一个操作数比较不等于 0,则第二个操作数为 未评估。

【讨论】:

    【解决方案2】:

    在 C 中 && 和 || “排序电路”,意思是如果左​​操作数的评估足以确定结果,则不评估右操作数。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2016-12-17
      • 2021-04-22
      • 2011-04-07
      • 2020-04-18
      • 2020-08-19
      • 2010-10-12
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多