【问题标题】:Short circuit evaluation with both && || operator使用 && || 进行短路评估操作员
【发布时间】:2016-08-21 03:59:19
【问题描述】:

我知道 C 中的短路评估是什么。

a && b(如果 a = 0,则不检查操作数 b)

a || b(如果 a = 非零,则不检查操作数 b)

但我被这个问题困住了

int x = 0;
if (5 || 2 && ++x)
    printf("%d", x);

这会输出0

我的第一个想法是这样的:

根据优先级表,优先级为++&&||(降序)

  1. ++x:evaluated.x 变为 1。

  2. 2 && ++x 已评估。计算两个操作数。

  3. || 已评估。

但是根据这个,应该打印1,而不是0

我的第二个想法是这样的:

5 || anything

anything 由于短路评估而未被评估,因此此处没有优先级。

【问题讨论】:

    标签: c short-circuiting


    【解决方案1】:

    正确。表达式短路了。你可以用这个来测试它。

    if(5 || ++x) {
      printf("%d\n",x);
    }
    

    【讨论】:

      【解决方案2】:

      由于运算符优先级,表达式5 || 2 && ++x 等价于5 || (2 && ++x)

      运行时从左到右计算表达式5 || 2 && ++x

      正如我们在 OR 中所知道的,如果第一个条件为真,它将不会检查第二个条件。
      所以这里 5 被评估为真,所以(2 && ++x) 不会被执行。

      这就是为什么 x 将在此处保持为 0。

      【讨论】:

        猜你喜欢
        • 2014-06-08
        • 2013-02-28
        • 2015-08-27
        • 1970-01-01
        • 2020-03-29
        • 2015-11-14
        • 2017-01-21
        • 2012-02-10
        • 2010-12-21
        相关资源
        最近更新 更多