在这个例子中C中的逻辑表达式的短路行为

use*_*717 5 c

程序

#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;
}
Run Code Online (Sandbox Code Playgroud)

结果

1 2 1 1
Run Code Online (Sandbox Code Playgroud)

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

为什么我错了?

Yu *_*Hao 10

优先级仅影响分组.&&优先级高于||手段:

++i || ++j && ++k
Run Code Online (Sandbox Code Playgroud)

相当于:

++i || (++j && ++k)
Run Code Online (Sandbox Code Playgroud)

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