LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 666|回复: 5

关于副作用(对变量赋值)的问题

[复制链接]
发表于 2004-6-5 07:30:24 | 显示全部楼层 |阅读模式
书本上有这样一段描述:

  1. 在涉及到副作用的表达式中,对作为表达式一部分的本来的求值次序存在着微妙的依
  2. 赖关系。下面的表达式语句是这种使人讨厌的情况的一个典型例子:

  3. a[i] = i++;

  4. 问题是,数组下标的值i是旧值还是新值。编译程序对之可以有不同的解释,并视不
  5. 同的解释产生不同的结果。C语言标准故意留下了许多诸如此类的问题未作具体规定。
  6. 何时处理表达式中的副作用(对变量赋值)是各个编译程序的事情,因为最好的求值
  7. 次序取决于机器结构。(标准明确规定了所有变元的副作用都必须在该函数被调用之
  8. 前生效,但这对上面对printf函数的调用没有什么好处。)
复制代码


是否真的存在这个问题?
我使用了tc2和gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)都没有发现什么不妥。

有些书上的东西让人越看越犯胡涂。
发表于 2004-6-5 11:40:48 | 显示全部楼层
这种代码是有问题 的,因为在C语言的标准中没有规定在这种情况下是先求解i++还是后求解i++,结果只能取决于编译器的实现。
 楼主| 发表于 2004-6-5 12:40:22 | 显示全部楼层
问题是:C标准规定了操作符的优先级和结合律;
那么当然是:

先a、接着(i++)、再a=(i++)、最后i=i+1。

这样理解C标准,对不对呢?
发表于 2004-6-5 14:26:45 | 显示全部楼层
"先a、接着(i++)、再a=(i++)、最后i=i+1。"
这个顺序是不一定的。
 楼主| 发表于 2004-6-5 14:53:17 | 显示全部楼层
但如果单从标准上讲,应该是这个顺序吧?
可能有的实现不是那么符合标准
发表于 2004-6-5 23:11:53 | 显示全部楼层
这不是标准的问题,标准根本没有规定在同一条语句中对同一变量进行两次修改的顺序问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表