作者alkali5566 (硷民五六)
看板C_and_CPP
标题[问题] 关於i=i++
时间Fri Apr 15 00:06:59 2016
小弟最近在学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呢?
谢谢!
--
标题 [请益] C/P值较高的耳机品牌? 看板 Headphone
───────────────────────────────────────
1F:→ tuiokh: 副厂的Earpod跟原厂会有差吗?05/19 16:55
2F:推 evadodoya: 那你觉得盗版的beats跟正版的有差吗05/19 17:05
3F:→ u87654321: 所以副场的earpod比较好罗?05/19 17:40
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.155.18
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1460650023.A.3AF.html
4F:推 longlongint: 直觉觉得是反串文的我怎麽了 04/15 00:08
5F:推 ilms49898723: Undefined Behavior 结案 04/15 00:11
6F:→ longlongint: 置底十戒之八 04/15 00:11
7F:→ longlongint: 十三戒之八 04/15 00:12
8F:→ alkali5566: 感谢楼上几位帮忙QQ,其实这是考试题目,所以我没有 04/15 00:15
9F:→ alkali5566: 想到是这方面的问题......学到了一课 04/15 00:15
10F:→ Schottky: 考试考 undefined behavior 是怎样 04/15 00:19
11F:→ alkali5566: 而且给的答案是说0...没说是Undefined Behavior 04/15 00:25
12F:→ alkali5566: 题目我是有简化过,不过大致上就是这边有问题 04/15 00:25
13F:→ wtchen: 下次记得看置底文喔,话说回来哪间学校出这种考题阿? 04/15 00:31
14F:→ Jockey66666: 把老师当掉 04/15 00:31
15F:→ Schottky: 我刚刚用 gcc 跑,结果是 1 耶~ XDD 04/15 00:31
16F:→ Schottky: 然後我有开 -Wall 所以有出现 warning 04/15 00:32
17F:→ Schottky: 快,拿这结果回去呛老师要分数 04/15 00:33
18F:→ alkali5566: 校名请恕我不说XD 我会跟老师反应这件事,再次感谢! 04/15 00:35
19F:推 winken2004: 考试题...... 04/15 01:30
20F:→ fatrabitree: 去呛老师,连undefined behavior都不知道 04/15 01:39
21F:→ tinlans: 老师真懒,改成 j = ++i 和 j = i++ 就没事了,叫他重出 04/15 01:59
我还是先澄清一下好了,原题目是给一段code要我们debug+写出debug後的output,
不过参考答案(好像是TA写的)没有提到这题有undefined behavior,
所以如果老师说这题我们应该要把这段错误改掉的话,我也就认了啦。
(虽然我之前没听过undefined behavior)
※ 编辑: alkali5566 (36.239.155.18), 04/15/2016 02:24:51
22F:→ wtchen: 搞不好是TA搞错… 04/15 02:30
23F:推 wtchen: 不过老师居然没教undefined behavior有点… 04/15 02:35
24F:推 Frozenmouse: 我觉得很多老师不会教这个的…XD 04/15 02:46
25F:推 bibo9901: 我一直觉得C++应该要直接让这种statement不合法 XD 04/15 03:23
26F:→ Schottky: 楼上,这类问题statement不见得全部都侦测得出来 04/15 03:42
27F:→ Schottky: 写复杂一点而逃过compiler检查是有可能的 04/15 03:43
28F:推 stupid0319: 会有人写这样的程式码搞自己吗? 04/15 07:01
29F:推 suhorng: 不会搞自己, 但是踩到雷还是有可能的, 不小心 alias 到.. 04/15 07:18
30F:推 ronin728: unsequenced expression,详见C++标准规格书ISO/IEC JTC 04/15 11:14
31F:→ ronin728: 1 SC22 WG21 N 3690第10页 04/15 11:14
32F:→ ronin728: Clang有很好的前端,这会有警告。GCC的话我没试过 04/15 11:16
33F:→ Schottky: 我是看 man gcc 的 -Wsequence-point 参数说明 04/15 11:53
34F:→ Schottky: 上面说有些更复杂的状况无法被这个参数侦测到 04/15 11:55
35F:→ Schottky: 但一般来说应付类似程式中的类似问题还是算相当有效 04/15 11:56
36F:→ Schottky: 你只要加 -Wsequence-point 或 -Wall 都会开启这项警告 04/15 11:57
37F:→ bibo9901: 我意思 有赋值(assign)的statement不视为expression 04/15 16:05
38F:→ bibo9901: 一并解决了 if( x = 1 ) 这种笔误... 04/15 16:06
39F:→ Schottky: 赞成! 那些爱用 if (-1==(fd=open(...))) 的人我早就 04/15 16:11
40F:→ Schottky: 看他们不顺眼很久了。 04/15 16:11
41F:→ Schottky: 还有那种 while (-1==(count=read(...))) 根本是邪教 04/15 16:17
42F:→ bibo9901: 缺点就是 x = y = z = 1 要分成三个 stmt 了 04/15 16:24
43F:→ ACMANIAC: 教到现在还没教整个程式语言最重要的undefined behavior 04/16 09:12
44F:→ ACMANIAC: 那上课到底在教什麽啊...... 04/16 09:12
45F:→ TobyH4cker: 教授不可能教吧XD 学生当自强 除非教授是神人 04/16 09:44
46F:→ Schottky: 教授也许不会吐 undefined behavior 这两个字 04/16 11:04
47F:→ Schottky: 但教授一定要教不可以在同一条 statement 里面赋值两次 04/16 11:05
48F:→ Schottky: 原来是缺乏神人教授指点,难怪我们都没有水晶球 04/16 11:06
49F:推 me356500: 大学考这个哦? 04/18 22:07