免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 请教一个基础问题——数组名减1是否可以 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
181 [报告]
发表于 2009-12-20 01:35 |只看该作者

回复 #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是否使用, 都没有联系。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
182 [报告]
发表于 2009-12-20 01:38 |只看该作者

回复 #180 pmerofc 的帖子

原帖由 pmerofc 于 2009-12-20 00:47 发表
通过讨论,现在知道至少是事出有因的(当然,可能远不是全部)


如果你能将"事"重现一次, 这帖基本就可以结了


-------- -------- -------- 更新 -------- -------- -------- --------
将你的话理解错了。
但我记得你在这个帖里有提到你曾经发现过一个错误,并且怀疑是因为指针指向越界地址。
能否将这个错误重现一下?  如果重现, 这帖就可以结了


我还想到一个结贴的方法 : 把gcc的源代码弄出来,加上越界检查,并且在越界时给出一个严重错误,生成一个新的C语言编译器 —— 那么,这帖应该也算是结了?
毕竟, 证明命题为假只需要举出一个反例即可。

[ 本帖最后由 OwnWaterloo 于 2009-12-20 02:05 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
183 [报告]
发表于 2009-12-20 01:45 |只看该作者
又找到一个不遵守标准引起移植性问题的例子:

http://bbs3.chinaunix.net/thread-1631360-1-1.html

如果标准提供的功能不能完成任务, 那不得已, 只能编写不可移植的代码, 并在移植时检查该处在目标平台下的行为。
如果标准提供的功能足够完成任务, 不使用标准提供的功能就是自己给自己找麻烦

论坛徽章:
0
184 [报告]
发表于 2009-12-20 03:32 |只看该作者
翻了一遍帖子。
本人菜鸟一只,没看过C标准,就不参与讨论了。
我觉得两个人争的不是一个问题,分成两个问题比较合适:
一是这样写是不是符合C标准;
一是在现在编译器中会不会有问题。
其实根本没有什么分歧。

个人观点。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
185 [报告]
发表于 2009-12-20 09:09 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
186 [报告]
发表于 2009-12-20 09:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
187 [报告]
发表于 2009-12-20 09:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
188 [报告]
发表于 2009-12-20 12:14 |只看该作者
其实吧,越界也不是不允许的,你还可以捕获越界,然后让程序继续运行

越界,只是通常情况不允许,但存在越界的特例。可是,这些特例比OwnWaterloo的假想更“邪恶”吗?又有啥理论让一个“邪恶”的假想比这些“邪恶”的特例更能被接受吗?没有!

所以,OwnWaterloo的例子有一些“诡辩”的味道,让人不舒服,让人不自觉地反对,尤其是一些“老手”

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
189 [报告]
发表于 2009-12-20 12:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
190 [报告]
发表于 2009-12-20 12:47 |只看该作者
原帖由 pmerofc 于 2009-12-20 09:16 发表


int *p;
*p=3;
有时候运行的也很好

这种用法应该是禁止的,除非:
int *p;
p=0xXXXXX;
*p=3;
才可能有实际意义.


这个例子可没有你前面举的例子有含量.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP