作者loveflames (咕啾咕啾魔法阵)
看板C_and_CPP
标题Re: [问题] ++ 与阵列的问题
时间Wed Mar 8 21:28:31 2017
a[x++] = --x符合E1=E2形式,先处理--x的计算与副作用
--x为前置运算,先处理副作用,x减1,这里可以得到a[x++] = 1
再来处理a[x++]的计算与副作用
x++为後置运算,先进行计算,得到a[1],接着x加1
即a[1] = 1,x为2
对17的新规则还不熟,有误请更正
不过老师考这个是害人,即便在17已经合法
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.248.34
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1488979714.A.705.html
1F:推 Hazukashiine: 下次老师就会加注:「请用C++17规则作答」03/08 21:30
2F:推 sinker5566: 感谢大大03/08 21:34
3F:→ loveflames: 过度重视求值顺序跟运算子优先顺序,我觉得害处很大03/08 22:10
4F:→ loveflames: 别人看到这种code还得去查表03/08 22:10
5F:推 descent: 为什麽 c++17 要定这个标准?03/08 22:36
6F:→ Caesar08: 因为有人发现,unspecified behavior会变成03/08 22:49
7F:→ Caesar08: undefined behavior03/08 22:49
8F:→ Caesar08: 读p0145r3就可以知道原因了03/08 22:50
9F:→ james732: 没有明确的定义,有带来任何好处吗?03/08 23:29
10F:推 wtchen: 感谢,已补充进13诫(觉得C++愈来愈龟毛)03/08 23:44
11F:→ final01: 为啥到c++17才规定...03/08 23:50
12F:→ uranusjr: 有规范是好事啦, 除非要让它 syntax error 不然就是个雷03/09 00:03
13F:→ uranusjr: 有规则的雷总比没规则的雷要好03/09 00:03
14F:→ loveflames: 不要过度使用就是03/09 00:08
15F:→ MOONRAKER: 不明确定义,方便compiler自由发挥。03/09 05:02
补充一个比较复杂的例子
//A为函数指标阵列,f为物件的方法
i=0;
++i = A[i++](i++,++i).f(i++);
规则
E1 = E2: E2->E1
E1 = E2: E1与E2的计算->E1的赋值
E1(E2,E3): E1->E2->E3
推导过程
a[0](i++,++i).f(i++),i=1
a[0](1,++i).f(i++),i=2
a[0](1,3).f(i++),i=3
a[0](1,3).f(3),i=4
++i为前置运算,副作用早於计算, i=5
结果为i = a[0](1,3).f(3)
※ 编辑: loveflames (60.248.56.181), 03/09/2017 13:23:34
16F:推 pili100: 这样写code有比较清楚吗?定义这个感觉吃饱太闲03/09 17:44
17F:→ loveflames: 定义是需要啦,不要滥用就好03/09 17:52
18F:推 wtchen: C++17真的闲到去定义这个?03/09 18:14
19F:→ loveflames: 我这篇写的都有定义03/09 18:27
20F:推 AstralBrain: E1(E2,E3)这里的E2,E3应该没规定顺序?03/09 19:02
我得更正前面的结论
看到置底十三诫的f(++i,++i),没查来源就直接套了
查规格书查半天都找不到
後来才知道在17虽然已不是undefined behavior
但仍是unspecified behavior
为避免混乱,这两行不要理它
21F:→ loveflames: 17有规定函数参数的求值顺序03/09 19:22
22F:→ loveflames: E1.E2应该要算成上面的那个,所以拿掉03/09 20:14
23F:推 wtchen: 我写的时候是参照这里 03/09 23:10
25F:推 wtchen: 已经把f(++i,++i)拿掉,感谢指正(真是乱到我都搞不懂) 03/09 23:12
26F:→ loveflames: 除了这个例子没找到,其他我在规格书都有翻到 03/09 23:28
27F:→ loveflames: 大多写在5.2节,而list-initIialization写在其他地方 03/09 23:29
28F:→ loveflames: f(i = -1, i = -1)不是从左到右,它合法的原因是 03/09 23:33
29F:→ loveflames: 进入function前每个argument的副作用会处理完毕 03/09 23:40
30F:推 wtchen: 不懂,那f(i=-1, i=1)的话,i会是-1还是1? 03/09 23:48
31F:→ loveflames: unspecified behavior 03/10 00:15
32F:→ loveflames: 左右方向随编译器定的 03/10 00:18
想到一个好例子,这个有查过规格书可以挂保证
T x(E1,E2); //unspecified
T x{E1,E2}; //E1 -> E2
※ 编辑: loveflames (36.237.103.169), 03/10/2017 10:15:38