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

来源:3-3 自增与自减运算符

Backkom

2015-10-20 21:37

#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、、

写回答 关注

6回答

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

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

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

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

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

    Backko...

    非常感谢!

    2015-10-21 21:41:25

    共 1 条回复 >

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

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

    Jaydon... 回复Backko...

    那你就按照我给你讲的方法呀,嘿嘿,给个最佳回答>

    2015-10-21 09:36:45

    共 2 条回复 >

  • 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;


    Jaydon...

    我觉得,我写的比最佳回答好!!!!!

    2015-11-05 22:31:54

    共 1 条回复 >

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

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

    Backko...

    程序运行结果i=18,j=17、、、、

    2015-10-20 22:34:08

    共 1 条回复 >

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

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

    menghu...

    或者自增长

    2015-10-20 21:58:14

    共 1 条回复 >

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

    m = 15 + 15 + 15;

    n = 19 + 17 + 16;

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926209 学习 · 20797 问题

查看课程

相似问题