如何解决这个逻辑表达式?

时间:2015-11-25 19:04:45

标签: c

请告诉我如何通过关联性和优先级来解决它:

   #include<stdio.h>

   int main()
   {
       int i=-3,j=2,k=0,m;
       m=++i||+j&&++k;
       printf("%d %d %d %d",i,j,k,m);
       return 0;
   }

2 个答案:

答案 0 :(得分:1)

++ii的值从-3增加到-2,这是真的,因此不计算剩余的表达式,并且表达式的结果为true(1)。因此:

i = -2, j = 2, k = 0, m = 1

Live Demo

答案 1 :(得分:1)

||&&强制从左到右操作。在评估RHS之前,两者都要充分评估其LHS操作数并应用任何副作用。两个短路;如果可以从LHS确定表达式的结果,则根本不评估RHS。

对于||,如果LHS评估为非零值,则不评估RHS(true OR x始终为true)。

对于&&,如果LHS评估为零值,则不评估RHS(false AND x始终为false)。

&&的优先级高于||,其优先级高于赋值,因此表达式已解析

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

评估如下:

    首先评估
  1. ++i||强制从左到右评估)并应用递增i的副作用;
  2. 由于i最初为-3++i评估为-2;
  3. 由于++i计算结果为非零值,因此根本不评估RHS表达式++j && ++k 1 ;
  4. 涉及||&&的操作结果是布尔值(01) - 因为++i非零, ++i || ++j && ++k评估为1;
  5. 1已分配给m
  6. 因此,当所有这一切都完成时,以下情况属实:

    i == -2
    j == 2  // unchanged
    k == 0  // unchanged
    m == 1
    

    <小时/> 1。如果++i已评估为0,那么++j && ++k将首先评估++j,如果结果非零,则评估++k