抱歉!想请问各位高手一个基本的问题..
我测试一个小小的程式码的时候
其中
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
作者: w347437 2016-11-03 17:17:00
先知道a++跟++a的差别吧a++是在整行程式结束(分号后)才做+1的动作,另外反之
抱歉,第一次发文开发平台(Platform): (Ex: Win10, Linux, ...) Win10编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) DEVC++
作者:
wtchen (没有存在感的人)
2016-11-03 17:27:00置底13诫 no.8 哪里看不懂?
不是针对你,谁写这种东西明天就不用来上班了+1这是 undefined behavior,你不能自己一厢情愿a++ 回传 a 是没错,但assign和increase不见得谁先做这就是第八诫要告诉我们的事,唐僧就是要他徒弟记住这点
这文好屌 已跪原po可以先google什么是undefined behavior
我上网查了undefined behavior,了解了..感谢各位..
我刚刚试了一下,gcc (Dev C++) 加 -Wall 会有 warning
就算有置底这个问题还是常常冒出来...以后是不是每本教科书或程式课一开始就先教这个算了或者考虑一下把它常驻板标呢XDD
作者:
wtchen (没有存在感的人)
2016-11-03 19:24:00大学有在教undefined behavior吗?
作者:
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..
我大学没教undefined behavior感谢各位...长了许多知识
作者:
hakman (^____^)
2016-11-03 23:21:00这个问题真的是蛮常出现的,大概一个月一次 Orz不过我也是来这个版之后才知道的 Orz
作者:
Yshuan (倚絃)
2016-11-04 00:15:00不是一句大学没教的问题...
解释一下,明天不用来上班的原因是这种 bug 极度难抓所以大家都已经训练有素,看见类似的写法立刻穷追猛打code review 时看见,不管执行结果对不对先开骂再讲因为就算目前执行结果是对的,不立刻改正以后可能会出错前面有人说在分号后才做,其实在复杂算式里不一定是这样而且复杂算式的未定义行为可能 compiler 也抓不出来
作者:
Ommm5566 (56天團)
2016-11-05 08:42:00开除+1 不要说不懂未定义 连++功能都不清楚是哪招
@michael0728n 括起来一样是 undefined behavior 无误
作者:
wtchen (没有存在感的人)
2016-11-05 17:01:00在C++, a = ++a OK, a=a++不行 (左值跟右值的问题)不过就算是C+我还是不希望看到这种code....
偷问一下,楼上的前者为何可以?因为++a会产生断点吗*sequence point
作者:
wtchen (没有存在感的人)
2016-11-05 18:38:00请看置底13诫-8,不过印象中C++11开始才能这么搞有人要总结一下C++14/17针对这方面的修改吗?
懂了,概念停在C++03,难怪看置底感觉怪怪置底好像改好了,谢谢版主~
作者:
wtchen (没有存在感的人)
2016-11-06 17:17:00因为板工很少用C++,愈来愈复杂 @@