[问题] 请问关于a=a++的问题

楼主: cat99961 (阿汤)   2016-11-03 17:06:33
抱歉!想请问各位高手一个基本的问题..
我测试一个小小的程式码的时候
其中
int a=0;
a=a++;
printf("%d",a);
结果是0
为什么不是1
我的想法如下:
1.先做a=a,此时a=0
2.再执行a=a+1,此时a=1
但结果却是0,和想的不同
请问各位大大,是什么原因呢?
感激不尽....
作者: aiwhat   2016-11-03 17:16:00
undefined behavior
作者: ilms49898723 (LittleBird)   2016-11-03 17:17:00
置底13诫 no.8
作者: w347437   2016-11-03 17:17:00
先知道a++跟++a的差别吧a++是在整行程式结束(分号后)才做+1的动作,另外反之
楼主: cat99961 (阿汤)   2016-11-03 17:22:00
抱歉,第一次发文开发平台(Platform): (Ex: Win10, Linux, ...) Win10编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) DEVC++
作者: wtchen (没有存在感的人)   2016-11-03 17:27:00
置底13诫 no.8 哪里看不懂?
楼主: cat99961 (阿汤)   2016-11-03 17:27:00
我知道a++和++a的区别,但是这个真的不一样
作者: BSpowerx (B.S)   2016-11-03 17:30:00
谁写这种东西先把他开除掉
楼主: cat99961 (阿汤)   2016-11-03 17:30:00
我这个和置底13诫 no.8 的不同
作者: Schottky (顺风相送)   2016-11-03 17:32:00
不是针对你,谁写这种东西明天就不用来上班了+1这是 undefined behavior,你不能自己一厢情愿a++ 回传 a 是没错,但assign和increase不见得谁先做这就是第八诫要告诉我们的事,唐僧就是要他徒弟记住这点
楼主: cat99961 (阿汤)   2016-11-03 17:37:00
抱歉!我致底13诫.no8有的地方没看到不过我觉得很奇怪,因为编译可以过而且我看过以下的文章http://www.jianshu.com/p/ff5b9db30f7f抱歉!我囉嗦了点...但我还是觉得很奇怪
作者: shadow0326 (非议)   2016-11-03 17:39:00
这文好屌 已跪原po可以先google什么是undefined behavior
作者: hn12404988 (Willy)   2016-11-03 17:47:00
a += 1
作者: james732 (好人超)   2016-11-03 17:47:00
置底第8诫有跟你说编译会不过吗?XD
楼主: cat99961 (阿汤)   2016-11-03 17:48:00
我上网查了undefined behavior,了解了..感谢各位..
作者: Schottky (顺风相送)   2016-11-03 17:52:00
我刚刚试了一下,gcc (Dev C++) 加 -Wall 会有 warning
作者: stupid0319 (征女友)   2016-11-03 18:33:00
这问题跟鸡生蛋还是蛋生鸡一样
作者: Littlechozy (キミに100%)   2016-11-03 18:35:00
就算有置底这个问题还是常常冒出来...以后是不是每本教科书或程式课一开始就先教这个算了或者考虑一下把它常驻板标呢XDD
作者: wtchen (没有存在感的人)   2016-11-03 19:24:00
大学有在教undefined behavior吗?
作者: Schottky (顺风相送)   2016-11-03 19:40:00
记得我们系的大一计程有教
作者: wtchen (没有存在感的人)   2016-11-03 19:52:00
我想把13诫加个第0诫讲undefined behavior好了
作者: Caesar08 (Caesar)   2016-11-03 19:54:00
我大一的时候没有教
作者: pttworld (批踢踢世界)   2016-11-03 20:45:00
可以尝试a=(a++),不过仍是不建议的写法。
作者: Caesar08 (Caesar)   2016-11-03 21:04:00
或是你可以使用C++17的compiler..
楼主: cat99961 (阿汤)   2016-11-03 22:01:00
我大学没教undefined behavior感谢各位...长了许多知识
作者: hakman (^____^)   2016-11-03 23:21:00
这个问题真的是蛮常出现的,大概一个月一次 Orz不过我也是来这个版之后才知道的 Orz
作者: Yshuan (倚絃)   2016-11-04 00:15:00
不是一句大学没教的问题...
楼主: cat99961 (阿汤)   2016-11-04 00:28:00
我那句是在回答wtchen的提问啦...
作者: Schottky (顺风相送)   2016-11-04 01:35:00
解释一下,明天不用来上班的原因是这种 bug 极度难抓所以大家都已经训练有素,看见类似的写法立刻穷追猛打code review 时看见,不管执行结果对不对先开骂再讲因为就算目前执行结果是对的,不立刻改正以后可能会出错前面有人说在分号后才做,其实在复杂算式里不一定是这样而且复杂算式的未定义行为可能 compiler 也抓不出来
作者: steve1012 (steve)   2016-11-04 02:34:00
根本就没差那一行 有什么必要写这样?
作者: jacky1989   2016-11-04 22:32:00
我也习惯写成a+=1,比较能预知行为
作者: Ommm5566 (56天團)   2016-11-05 08:42:00
开除+1 不要说不懂未定义 连++功能都不清楚是哪招
作者: michael0728n (蒜˙远古)   2016-11-05 16:50:00
就算有括号起来应该也还是UB? 不是很确定XD
作者: Schottky (顺风相送)   2016-11-05 16:54:00
@michael0728n 括起来一样是 undefined behavior 无误
作者: wtchen (没有存在感的人)   2016-11-05 17:01:00
在C++, a = ++a OK, a=a++不行 (左值跟右值的问题)不过就算是C+我还是不希望看到这种code....
作者: michael0728n (蒜˙远古)   2016-11-05 18:14:00
偷问一下,楼上的前者为何可以?因为++a会产生断点吗*sequence point
作者: wtchen (没有存在感的人)   2016-11-05 18:38:00
请看置底13诫-8,不过印象中C++11开始才能这么搞有人要总结一下C++14/17针对这方面的修改吗?
作者: michael0728n (蒜˙远古)   2016-11-06 09:21:00
懂了,概念停在C++03,难怪看置底感觉怪怪置底好像改好了,谢谢版主~
作者: wtchen (没有存在感的人)   2016-11-06 17:17:00
因为板工很少用C++,愈来愈复杂 @@
作者: deangood01 (跨斯欧鹅)   2016-11-06 19:23:00
感觉需要拆板了~

Links booklink

Contact Us: admin [ a t ] ucptt.com