A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 离渊 中级黑马   /  2014-3-2 15:35  /  2009 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 离渊 于 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;

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 conpgy 于 2014-3-2 16:39 编辑

千万不要这样写程序。不同的编译器对这个语句的执行结果是不一样的。编译器应该不允许编程人员这样写。至少也应该给出警告。这里的警告的意思大概是a的自增运算顺序是不确定的。有可能先执行a++,也有可能先执行++a。这里编译器采取先执行a++,即执行完后a++的结果为10,而a变成了11。然后再执行++a。即a先加1,变为12。再执行+运算。因此是10 + 12。但这不是一定的。也许有的编译器会先执行后面的++a,再执行前面的a++,而且a的值到底什么时候增加都是编译器说的算。因此最终运算的结果是不确定的。因此这里编译器给你的警告是:哥们,请不要这样干!如果你非要这样干,我只能按我的想法给你运行了,到时出了问题可不要赖我啊!
这条语句在有的编译器上是通不过的。因此不应该这样写。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
同样是初学者 看到上面的解释有点似懂非懂的样子。。
我只知道 a++是a先参加运算 再自加1
++a是先自加1之后a再参与运算。。
回复 使用道具 举报
conpgy 发表于 2014-3-2 16:38
千万不要这样写程序。不同的编译器对这个语句的执行结果是不一样的。编译器应该不允许编程人员这样写。至少 ...

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

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

这样就清晰很多
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马