小弟最近在学C++,
可是遇到了一个递增运算子的问题,一直搞不懂,
比方说:
int i=0;
i=++i;
cout << i <<endl;
可以预期是先跑i=0+1,再令i=1,因此结果为输出1,实际上也是如此。
但是在下面的情况:
int i=0;
i=i++;
cout << i <<endl;
我觉得应该是i=0,再令i=0+1,因此输出1吧?
可是实际去run,结果却是0。
想请问各位大大是为什么为0呢?
谢谢!
作者: longlongint (华哥尔) 2016-04-15 00:08:00
直觉觉得是反串文的我怎么了
作者: longlongint (华哥尔) 2016-04-15 00:11:00
置底十戒之八十三戒之八
感谢楼上几位帮忙QQ,其实这是考试题目,所以我没有想到是这方面的问题......学到了一课
考试考 undefined behavior 是怎样
而且给的答案是说0...没说是Undefined Behavior题目我是有简化过,不过大致上就是这边有问题
作者:
wtchen (没有存在感的人)
2016-04-15 00:31:00下次记得看置底文喔,话说回来哪间学校出这种考题阿?
我刚刚用 gcc 跑,结果是 1 耶~ XDD然后我有开 -Wall 所以有出现 warning快,拿这结果回去呛老师要分数
校名请恕我不说XD 我会跟老师反应这件事,再次感谢!
去呛老师,连undefined behavior都不知道
作者:
tinlans ( )
2016-04-15 01:59:00老师真懒,改成 j = ++i 和 j = i++ 就没事了,叫他重出
作者:
wtchen (没有存在感的人)
2016-04-15 02:30:00搞不好是TA搞错…不过老师居然没教undefined behavior有点…
作者:
bibo9901 (function(){})()
2016-04-15 03:23:00我一直觉得C++应该要直接让这种statement不合法 XD
楼上,这类问题statement不见得全部都侦测得出来写复杂一点而逃过compiler检查是有可能的
作者:
suhorng ( )
2016-04-15 07:18:00不会搞自己, 但是踩到雷还是有可能的, 不小心 alias 到..
unsequenced expression,详见C++标准规格书ISO/IEC JTC1 SC22 WG21 N 3690第10页Clang有很好的前端,这会有警告。GCC的话我没试过
我是看 man gcc 的 -Wsequence-point 参数说明上面说有些更复杂的状况无法被这个参数侦测到但一般来说应付类似程式中的类似问题还是算相当有效你只要加 -Wsequence-point 或 -Wall 都会开启这项警告
作者:
bibo9901 (function(){})()
2016-04-15 16:05:00我意思 有赋值(assign)的statement不视为expression一并解决了 if( x = 1 ) 这种笔误...
赞成! 那些爱用 if (-1==(fd=open(...))) 的人我早就看他们不顺眼很久了。还有那种 while (-1==(count=read(...))) 根本是邪教
作者:
bibo9901 (function(){})()
2016-04-15 16:24:00缺点就是 x = y = z = 1 要分成三个 stmt 了
作者:
ACMANIAC (請肥宅救救肥宅)
2016-04-16 09:12:00教到现在还没教整个程式语言最重要的undefined behavior那上课到底在教什么啊......
教授也许不会吐 undefined behavior 这两个字但教授一定要教不可以在同一条 statement 里面赋值两次原来是缺乏神人教授指点,难怪我们都没有水晶球