本例中C中逻辑表达式的短路行为

时间:2015-01-26 05:24:36

标签: c

PROGRAM

#include <stdio.h>

int main(void)
{
    int i, j, k;

    i = 1; j = 1; k = 1;

    printf("%d ", ++i || ++j && ++k);
    printf("%d %d %d", i, j, k);

  return 0;
}

观察

1 2 1 1

我期待1 1 2 2.为什么?因为&amp;&amp;优先于||。所以我按照以下步骤操作: 1)j加1,所以j现在值2 ...  2)k加1,所以k现在值2 ...  3)2&amp;&amp; 2,评估为1 ...  4)无需进一步评估作为||的右操作数是的,所以整个表达式必须是真的,因为逻辑表达式的短路行为......

为什么我错了?

1 个答案:

答案 0 :(得分:9)

优先级仅影响分组。 &&的优先级高于||的含义:

++i || ++j && ++k

相当于:

++i || (++j && ++k)

但这并不意味着首先评估++j && ++k。它仍然从左到右进行评估,根据||的短路规则,++i为真,因此永远不会评估++j && ++k