作者cozychocolat (chocolate)
看板C_and_CPP
标题[问题] 指标阵列的运算问题
时间Mon Apr 10 15:25:26 2017
各位大大你们好
最近在学习指标时发现一个问题
其实说是指标问题
到不如说是运算问题
先附上我的程式码
http://ideone.com/jXGjmA
这题我预想的结果应该要是
13 15 17 19 21
但是出来的结果却不是如此
我的问题是在
*ptr = *(ptr++) + con;
这行我认为应该是先做
*ptr = *ptr +con;
然後才 ptr++
所以应该会是 13 15 17 19 21
但为什麽不是呢
恳请各位大大帮忙解答
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 150.117.221.154
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1491809129.A.349.html
1F:推 wrt: 一样呀,这是ptr++,不是++ptr04/10 15:34
但是我用codeblock执行出来的结果是
3 13 23 33 43
跟预期的结果不一样ㄝ
※ 编辑: cozychocolat (150.117.221.154), 04/10/2017 15:39:54
2F:→ kokal: undefined behavior. i=i++ 置底看一下吧04/10 15:44
对ㄝ
我用以下程式码测试
x=1
for(i=1 ; i<=5 ; i++)x=x++
输出的x值都是1
但是在原程式当中
ptr的值每次都有变化
都是指向array的下一个位置
这又是为什麽呢
※ 编辑: cozychocolat (150.117.221.154), 04/10/2017 16:10:32
3F:推 CoNsTaR: 未定义行为是什麽意思你不先想想看吗04/10 16:23
上网查了一下undefined behavior
是否是指这样的写法并不在编译器的规定内
所以在不同的编译器上会有不同的答案
那是否以後应该改成
*ptr = *ptr + con
ptr++
就不会发生这种问题了
※ 编辑: cozychocolat (150.117.221.154), 04/10/2017 17:04:55
4F:推 loveflames: 这行为在17有定义,顺序跟你想的相反04/10 18:07
不好意思,您是说在哪里有定义
5F:推 Hazukashiine: 改成这样就行了 *ptr++ += con; // well-defined04/10 18:23
这样的确可正确执行,只是还是想知道是否是我的写法出问题
6F:→ pttworld: 括号的优先权不需解释吧 04/10 19:48
7F:推 SeamusBerloz: 加了挂号,++ 就优先了。04/10 20:28
若加括号後优先权最高
则执行逻辑是否变成
ptr ++
*ptr = *ptr +con
这样结果我觉得应该是
3 15 17 19 21
但执行结果却是
3 13 23 33 43
不管有没有加括号 结果都为
3 13 23 33 43
这又是为什麽呢
※ 编辑: cozychocolat (150.117.221.154), 04/10/2017 21:05:26
8F:推 LPH66: loveflame 说的是 C++ 最新标准 C++17 04/10 21:27
9F:→ LPH66: 另外括号跟计算顺序是两回事, 括号只管结合优先度 04/10 21:27
10F:→ LPH66: 实际上谁先算看状况 04/10 21:28
11F:推 loveflames: 我当初在挖17时没特别去记下面这个情况 04/10 21:43
12F:推 loveflames: E1 += E2,E1本身的副作用要放在左边还右边 04/10 21:45
13F:推 loveflames: 我是觉得如果等价於E1 = E1 + E2,E1副作用要放右边 04/10 21:48
15F:→ kokal: 括号不是sequence point,副作用只要求在sequence point做完 04/10 22:56
16F:→ kokal: *在sequence point前做完 04/10 22:57
17F:推 loveflames: 括号只管计算不管副作用 04/10 23:03
18F:推 LPH66: 括号跟计算顺序之间的差别例如 a && (b || c) 04/10 23:25
19F:→ LPH66: 由於 && || 的短路特性, 一定是 a → (可能)b → (可能)c 04/10 23:26
20F:→ LPH66: 这样的顺序计算 04/10 23:26
21F:→ LPH66: 这甚至不用扯到副作用就有差了 04/10 23:27
22F:→ LPH66: 那扯到副作用就更复杂, 就要找上面提的 sequence point 04/10 23:28
23F:推 loveflames: Hazukashiine那个+=例子让我脑袋当机了,现在不方便 04/10 23:29
24F:→ loveflames: 找规格书 04/10 23:29
25F:推 loveflames: 话说11後的用词改成sequenced before/after 04/10 23:34
26F:推 loveflames: 查到了,左边的计算比op=先处理 04/11 10:17
27F:推 achicn3: *(ptr+k)+=con 04/12 14:17