C运算符优先级,增量后编程问题

C运算符优先级,增量后编程问题,c,operators,post-increment,operator-precedence,C,Operators,Post Increment,Operator Precedence,有人能解释为什么程序的输出是 01131 void main(void) { int i=-1,j=0,k=1,l=2,m; m=i++&&j++&&k++||l++; printf("%d %d %d %d %d",i,j,k,l,m); } 主要关注点是“为什么k不增加” 仅供参考。我正在VC++编辑器Windows 7 32位中编译该程序。 非常感谢。让我们将其分解为单独的操作: i++&&j++:这将与-1&&0

有人能解释为什么程序的输出是

01131

void main(void)
{
      int i=-1,j=0,k=1,l=2,m;

      m=i++&&j++&&k++||l++;

      printf("%d %d %d %d %d",i,j,k,l,m);

}
主要关注点是“为什么k不增加”

仅供参考。我正在VC++编辑器Windows 7 32位中编译该程序。
非常感谢。让我们将其分解为单独的操作:

  • i++&&j++
    :这将与
    -1&&0
    相同,为false(即0)
  • i
    j
    分别增加到
    0
    1
  • 0&&k++
    :零来自上一个逻辑运算,结果为false,因为第一个运算符为false
  • k
    没有增加,因为逻辑运算符的快捷性质
  • 0 | | l
    :零仍然来自先前的逻辑操作,它是
    0 | | 2
    ,结果将为真,即
    1
  • l
    增加到
    3
  • 逻辑运算的结果被分配给
    m
    ,该结果现在变为真(即
    1

  • 整个表达式使
    i
    j
    l
    增加,而
    m
    变为
    1
    。只是您看到的结果。

    您的值的计算如下所示

    m=((((i++)&&j++)&&k++)||l++); 
    
    由于all++都是增量后的,所以在计算m期间,所有变量的值都与您初始化的值相同,但在打印期间的下一行,它们都是增量。最后一行是| |,因此final TRUE将返回m的值。

    大致如下:

    要计算
    i++&&j++
    ,编译器首先计算
    i
    。结果是
    -1
    <代码>-1存储在临时变量中。然后
    i
    得到递增

    因为
    -1
    不是零,编译器计算
    j
    ,即
    0
    。编译器现在评估
    -1&&0
    ,即
    0
    。然后
    j
    得到递增

    此时,
    i=0
    j=1
    。剩余表达式:
    m=0&&k++|l++

    为了计算
    0&&k++
    ,编译器注意到第一个操作数是
    0
    。结果必须是
    0
    ,所以编译器没有计算
    k
    k++
    。剩余表达式:
    m=0 | | l++


    我希望你能做剩下的事。:)

    对于复杂表达式最好使用括号。使用括号计算表达式的方式。请参见,没有什么比
    void main()
    更让我怀旧的了。由于逻辑运算符的快捷性质,k的可能重复数没有增加--->它是如何决定的?@PowerPC在这样一个
    0&&1
    表达式中,结果保证是
    0
    ,因此,不需要计算
    &&
    运算符的右侧。与
    1 | | 0
    相同,它将始终是
    1
    ,并且发生相同的事情。这都是在C规范中指定的。感谢您的详细解释。@JoachimPileborg:+1用于解释感谢您解释为什么k不递增!