黑马程序员技术交流社区

标题: a++ 为什么一会+1 一会不加1? [打印本页]

作者: 离渊    时间: 2014-3-2 15:35
标题: a++ 为什么一会+1 一会不加1?
本帖最后由 离渊 于 2014-3-3 22:31 编辑

#include <stdio.h>

int main()
{
    int a=10;
    int b;

    // b= 10+12
    b = a++ + ++a;

    printf ("b=%d\n",b);
    return 0;
}
视频里面本来讲 a++ 就是a=a+1   运算 b= a++ + ++a的时候 为什么运算++a 的时候把a当11 计算结果时候又按10 算呢
还有这个警告什么意思 j.c:9:10: warning: multiple unsequenced modifications to 'a' [-Wunsequenced]
    b = a++ + ++a;


作者: conpgy    时间: 2014-3-2 16:38
本帖最后由 conpgy 于 2014-3-2 16:39 编辑

千万不要这样写程序。不同的编译器对这个语句的执行结果是不一样的。编译器应该不允许编程人员这样写。至少也应该给出警告。这里的警告的意思大概是a的自增运算顺序是不确定的。有可能先执行a++,也有可能先执行++a。这里编译器采取先执行a++,即执行完后a++的结果为10,而a变成了11。然后再执行++a。即a先加1,变为12。再执行+运算。因此是10 + 12。但这不是一定的。也许有的编译器会先执行后面的++a,再执行前面的a++,而且a的值到底什么时候增加都是编译器说的算。因此最终运算的结果是不确定的。因此这里编译器给你的警告是:哥们,请不要这样干!如果你非要这样干,我只能按我的想法给你运行了,到时出了问题可不要赖我啊!
这条语句在有的编译器上是通不过的。因此不应该这样写。
作者: 白鳥翼    时间: 2014-3-2 18:19
同样是初学者 看到上面的解释有点似懂非懂的样子。。
我只知道 a++是a先参加运算 再自加1
++a是先自加1之后a再参与运算。。
作者: 离渊    时间: 2014-3-2 22:21
conpgy 发表于 2014-3-2 16:38
千万不要这样写程序。不同的编译器对这个语句的执行结果是不一样的。编译器应该不允许编程人员这样写。至少 ...

视频 里的那个老师就这么教的  看的我云里雾里 现在我觉得应该是 只要a后面的++就不管了 直接赋值到b 后面的++只对下个a的运算起作用
作者: 离渊    时间: 2014-3-2 22:25
白鳥翼 发表于 2014-3-2 18:19
同样是初学者 看到上面的解释有点似懂非懂的样子。。
我只知道 a++是a先参加运算 再自加1
++a是先自加1之后 ...

:D 让我清晰不少 3q
作者: Jine    时间: 2014-3-21 23:54
我一开始也分不清a++和++a的区别,后来想到了一个方法:如果a=10的话,(1)a++你先理解成口袋里有10+1=11块钱,只拿出了10块钱,计算机认为你只有10,搜了你全身才知道还有1块钱;(2)++a是口袋里有11块钱,你全拿出来了,计算机还搜了一次,发现没一分钱了!
作者: 罗冠坤    时间: 2014-3-22 13:34
如果像楼主那样计算,需要给自增运算符明确的括号例如:
  1. b = (a++) + (++a);
复制代码

这样就清晰很多




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2