【问题标题】:Why c is not incremented in the output?为什么 c 在输出中不递增?
【发布时间】:2012-02-22 16:22:12
【问题描述】:

我正在研究 C 基础知识并试图解决以下问题,谁能解释为什么变量 c 的输出不同?

以下程序的输出是什么?

int main()
{
   int a = -3, b = 2, c= 0, d;
   d = ++a && ++b || ++c;
   printf ("a = %d,  b = %d, c = %d, d = %d", a, b, c, d);
} 

答案:-2, 3, 0, 1

为什么c 在输出中没有增加?

【问题讨论】:

  • d = ( (-2 && 3) || (++c) )。它在到达 c 之前发生短路。
  • 你到底想做什么?或者你只是在玩一些代码?
  • 简单解c谜题
  • 感谢大家的帮助。现在能够更好地了解情况。 :)

标签: c short-circuiting


【解决方案1】:

变量c 不会递增,因为除非 LHS 评估为 false,并且 LHS 评估为 true,否则不会执行 || 的 RHS(右侧)。 C ||&& 运算符是“短路”运算符;他们不计算第二个操作数,除非第一个操作数不足以确定表达式的整体真实性。

&&|| 绑定得更紧密,所以操作可以用括号括起来:

d = (++a && ++b) || ++c;

++a 的值为 -2,计算结果为真(因为任何非 0 的值都计算为真); ++b 的值为 3,计算结果为 true;所以&& 的值是真的。因为true || falsetrue || true 都评估为true,所以无需评估RHS 即可知道整体结果。 (&& 的类似规则是,如果第一项评估为假,则无需评估第二项,因为整体表达式必须为假。如果您在测试之前有a = -1;,那么b 不会增加,因为++a 会为零或假,所以&& 的右轴是不求值的。当然,那么c 会增加,因为|| 的左轴为假,右轴会必须进行评估以确定整体结果。)

【讨论】:

  • 也许他不明白 -2 和 3 如何计算为真。
【解决方案2】:

因为++a && ++b 的计算结果为true

这叫做短路。条件内的表达式从左到右计算。如果您的情况是,如果 OR 子句中的第一个条件被评估为 true,那么第二个条件也没有必要被评估,因为整个表达式已经知道是 true

【讨论】:

    【解决方案3】:

    在 C 中,布尔逻辑运算符 &&||short-circuiting。这意味着如果评估左侧不足以知道答案,他们只会评估右侧。

    对于您的代码,这具有永远不会评估 ++c 的效果,因为左侧不为零,因此布尔值或的结果将为真,无需做更多工作。

    【讨论】:

      【解决方案4】:

      这是惰性布尔表达式求值。 执行是:

      ++a-2

      ++b3

      -2 && 31

      好的!无需检查|| 的结果。所以++c 不会被评估。

      规则是:X 的表达式部分在以下情况下不求值:(0 && X)(1 || X)。这里1当然是“非0”。

      【讨论】:

        【解决方案5】:
        d= ++a && ++b || ++c d= ++(-2) && ++b || ++c d= -1 && ++b || ++c d=真 && ++b || ++c d=真 && ++2 || ++c d=真&&真|| ++c d=真|| ++c d= 1

        这就是它在幕后的大致工作方式......

        【讨论】:

          猜你喜欢
          • 2018-09-06
          • 1970-01-01
          • 1970-01-01
          • 2012-08-24
          • 2022-01-15
          • 1970-01-01
          • 2020-04-02
          • 2014-09-11
          • 2014-09-04
          相关资源
          最近更新 更多