【问题标题】:Does while loop check every condition?while 循环是否检查每个条件?
【发布时间】:2023-03-06 09:27:01
【问题描述】:

假设我在 C 中有以下循环:while(x1 && x2)。 如果第一个条件为假 (x1==0),那么 while 循环会检查第二个条件吗?

【问题讨论】:

  • 这与while无关(只有一个条件),与&&有关。
  • 这是基本的,任何基本的 C 教科书都包含它。而且,正如@melpomene 指出的那样,它与while 无关。我建议您通过阅读这样的书而不是在这里提出零碎的问题来正确学习语言。

标签: c loops while-loop conditional-statements


【解决方案1】:

如果第一个条件为假 (x1==0),那么 while 循环会检查第二个条件吗?

没有。不会的。

它叫short circuit evaluation

来自C11, 6.5.13

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


cond1 || cond2 类似,如果cond1 评估为true,则不会评估cond2。见:C11, 6.5.14:

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

【讨论】:

    【解决方案2】:

    如果第一个条件评估为假,则第二个条件由标准保证被评估。

    来自C standard 的第 6.5.13 节:

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

    【讨论】:

      【解决方案3】:

      不,如果第一个条件为假,它将直接停在那里。
      这样,如果您想检查诸如 if (arrayLength < 10 && array[15] == 'c') 之类的内容(假设 arrayLength 是数组的长度),就可以避免诸如分段错误之类的错误。

      【讨论】:

        【解决方案4】:

        C 执行短路评估。如果x1 为假,则整个表达式不可能为真,因此永远不会评估x2

        【讨论】:

          猜你喜欢
          • 2017-04-03
          • 2019-11-23
          • 2011-03-31
          • 2011-09-09
          • 2015-01-02
          • 1970-01-01
          • 1970-01-01
          • 2013-05-09
          • 2016-12-06
          相关资源
          最近更新 更多