C 如何理解背靠背操作员的行为?

C 如何理解背靠背操作员的行为?,c,logical-operators,operator-precedence,C,Logical Operators,Operator Precedence,我在使用和或虽然这是一个基本问题,但我有很多困惑。我知道在使用AND或逻辑运算符时存在短路方法 Assume int a,x=0,y=0; a). a= 10 && ++x && y++ Values a=0,x =1,y=1 [expected ] b). a= 10 && ++x || y++ Values a=1 ,x=1,y=0 [short circuit ,expected ] c). a= 10 || ++x |

我在使用和或虽然这是一个基本问题,但我有很多困惑。我知道在使用AND或逻辑运算符时存在短路方法

Assume int a,x=0,y=0;
a). a= 10 && ++x && y++ 

Values a=0,x =1,y=1 [expected ]


 b). a= 10 && ++x || y++
 Values a=1 ,x=1,y=0 [short circuit 
  ,expected ]

 c). a= 10 || ++x || y++
 Values a=1 , x=0, y=0 [short 
  circuit ]
我的问题是:

  • a=10&&y++

    Values a =0, x=0(default didn't 
    change ), y=1 [ expected no short 
    circuit y is incremented later and 
    hence a =0 ]
    
  • 关于问题1

    a = 10 || ++x && y++ 
    
  • 实际值:

     a=1, x=0,y=0
    
    我所期望的是:

     a = 0, x=0, y=1 
    
    说明:10 | |++x(短路)

    所以我仍然使用a=(1&&y++)=>a=0(没有短路,y有后增量),因此a=0,y=1


    我如何理解我的问题2;我想我错过了什么。

    &
    都强制从左到右评估<代码>&的优先级高于
    |
    1,因此
    a | | b&&c
    被解析为
    a | |(b&&c)
    。请记住,对于
    a | | b
    ,如果
    a
    为非零,则表达式的结果为1,与
    b
    的值无关,因此根本不计算
    b
    。因此,在表达式
    a | |(b&c)
    中,如果
    a
    为非零,则不计算
    (b&c)

    因此,给定
    a=10 | x++&++y
    10
    为非零,这意味着表达式的结果将为1,而不管
    x++&++y
    的结果如何,因此既不计算
    x++
    也不计算
    ++y


  • 优先级仅控制表达式的解析方式(哪些运算符与哪些操作数分组)-它不控制表达式的求值顺序。