问答详情
源自:3-3 自增与自减运算符

这个自增运算实在搞不懂了,,,

#include <stdio.h>
int main()
{
    int m,n,i=15,j=20;
	m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j);
	printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
    return 0;
}

为啥m直为45而不是15+16+17=48,n值为53不是19+18+17=54、、

提问者:Backkom 2015-10-20 21:37

个回答

  • onemoo
    2015-10-21 01:18:57
    已采纳

    这算是化石级的经典错误了...

    第5行,这个两个关于i和j表达式的行为是未定义的,不同编译器也许会得出不同的结果。别去分析为什么会得出这个值或是那个值了,这种写法根本就是个错误!

    详细的原因请看这里我的回答 http://www.imooc.com/qadetail/87888

    注意那个“序列点”的概念,你这个表达式的问题和我在那个帖子中解释的一样:在求m和n的这两个语句中,你无法确定 i 和 j 都是什么值。

  • Jaydon_
    2015-10-20 23:02:34

    但是这个好像跟编译器有关系,有的时候可能不太一样,这个我忘了。。。。

  • Jaydon_
    2015-10-20 23:01:37

    嘿嘿,小兄弟,我告诉你一个方法,希望可以帮助你理解。


     int m,n,i=15,j=20;

        m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j);

    这边i++相当于这样

    m=i+i+i; 15+15+15

    i++;

    i++;

    i++;

    而--j是相反的在表达式前面执行相当于这样

    --j; j=19

    --j; j=18 

    --j; j=17

    n=17+17+17;


  • menghuanbaolei
    2015-10-20 21:57:41

    所以,你最后求到的, i=16 , j =17

  • menghuanbaolei
    2015-10-20 21:56:18

    表达式执行完毕后 “a” 的值都自减少1。

  • menghuanbaolei
    2015-10-20 21:54:16

    m = 15 + 15 + 15;

    n = 19 + 17 + 16;