- 论坛徽章:
- 2
|
回复 #179 mik 的帖子
我明白你的意思了。
的确, segment + offset 是我假想出来的。 有可能并不存在。
而且这个假想的灵感也确实是建立在x86上,因为除了x86和i386, 其他平台我都没有用过。 用过一次ppc, 看不懂……
但是, 我并不认为"通过假想来证明lz的命题" 这种方式是错误的。 恰恰相反, 要证明lz的问题, 假想是唯一的手段。
lz的命题是 "数组名-1 是否可以" 。 不妨将命题换作 "在任何平台的C实现中数组名-1是否可以"。
从lz的回帖来看, 我觉得后面这个命题才是lz的真正想讨论的问题。
那么,证明这个命题的真伪的方法:
1. 证明这个命题为真
通过实践是无法证明的。
原帖由 OwnWaterloo 于 2009-12-15 04:25 发表 ![]()
无论你能够通过实验证明它在1个平台、2个平台、n个平台上拥有正确行为都没用。
无论n多大,万一第n+1个平台就不许你这样做了呢?
证明这个命题为真的唯一手段, 就是C standard。还有其他手段吗?
而C standard中说只有指针在 a+0到a+n之间移动, 才有良好定义, 其他情况未定义。 或者C standard在其他地方有能够证明这个命题为真的描述?
综上, 暂时无法证明这个命题为真。
2. 证明这个命题为假。
这个就比较简单了。
只要列出一种可能的C实现:
1. 它不违反标准,满足标准对实现的要求
2. 它对引用a+0, a+n之外的位置会产生编程错误
就能够证明命题 "在任何平台的C实现中数组名-1是否可以" 为假命题。
所以…… 我就假想了这么一种平台以及器上的C语言实现方式, 它确实满足标准的要求, 而且会对范围外的指针产生编程错误。
综上—— 如果那个假想本身是没有错误的话 —— 命题得证, 为假。
这和C语言是否都使用segment + offset 或者都不使用segment + offset 来表达指针, x86是否使用, 都没有联系。 |
|