数组索引问题

软件和网站开发以及相关技术探讨
回复
ubunbates
帖子: 120
注册时间: 2014-04-30 15:44
系统: linux
送出感谢: 5 次
接收感谢: 4 次

数组索引问题

#1

帖子 ubunbates » 2014-10-04 18:32

下面这段代码, 为嘛i++不能作为数组arr[]的索引, 而一定要开写成arr=2*i;i++;

代码: 全选

int i = 0, arr[8];
while(i<8){
  arr[i++] = 2*i;
}

比如, arr[i-2]我用不同的compiler得到不同的结果, 有12和14
jinjiachen
帖子: 2125
注册时间: 2012-12-16 15:43
系统: debian
送出感谢: 9 次
接收感谢: 27 次

Re: 数组索引问题

#2

帖子 jinjiachen » 2014-10-04 18:45

i++不是表达式是赋值语句
头像
astolia
论坛版主
帖子: 4617
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 773 次

Re: 数组索引问题

#3

帖子 astolia » 2014-10-05 18:53

这个问题的本质原因是
arr[i++] = 2*i;
这一句中,2*i涉及到对i的一次读取,而i++涉及到对i的一次读和一次写。
而2*i的读和i++的读写操作相对独立,具体的执行顺序C语言是没有规定的,属于未定义行为。对于存在未定义行为的代码,就不要指望不同编译器能得到一致结果。

关于未定义行为,这篇讲的比较详细
http://www.cnblogs.com/jiayouwyhit/p/3147557.html

这也是谭浩强C教程的重大硬伤之一
ubunbates
帖子: 120
注册时间: 2014-04-30 15:44
系统: linux
送出感谢: 5 次
接收感谢: 4 次

Re: 数组索引问题

#4

帖子 ubunbates » 2014-10-08 22:01

astolia 写了:这个问题的本质原因是
arr[i++] = 2*i;
这一句中,2*i涉及到对i的一次读取,而i++涉及到对i的一次读和一次写。
而2*i的读和i++的读写操作相对独立,具体的执行顺序C语言是没有规定的,属于未定义行为。对于存在未定义行为的代码,就不要指望不同编译器能得到一致结果。

关于未定义行为,这篇讲的比较详细
http://www.cnblogs.com/jiayouwyhit/p/3147557.html

这也是谭浩强C教程的重大硬伤之一
谢谢啊. 我没学过C, 而cpp是自学的, 仅仅是用哪些看哪些. 在别的地方问过, 有人给的答案是不同的编辑器优化程度不一样, 所以影响了结果.
回复

回到 “软件/网站开发”