免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
0
122 [报告]
发表于 2009-12-17 21:56 |只看该作者
原帖由 OwnWaterloo 于 2009-12-17 21:39 发表
本来我觉得你知识面确实挺广的。 但怎么就这么固执呢?
是不是承认自己的错误对你来说很难?

17楼已经写出了标准的说法。 标准又说读写才是未定义行为吗?
再引用一下:

仔细看看这句话, 包括chenzhan ...

嘿嘿,小伙子不要激动,我年纪也不你大多少,不要叫我老前辈,我还年轻。同时我绝对不固执的,只要是证明我错了,一定认,我泡CU也有段时间了,向别人承认错误的帖子不知发了多少,我绝对就事论事的。

《C 语言常见问题集》中的这段我也看过,但它并没有证明什么,世界上不同寻址方式的机器多了。
>>用segment + offset的机器不是不存在
这个当然存在,intel的IA32就是这种。
>>无法证明所有机器 offset 都一定不会回绕。
这个想法确实很新颖。是无法证明,世界上没有任何一句话可以说绝。

我就不讨论这个问题了。我只讨论有实际例子的东西,我个人不善于讨论纯理论。
但无论如何,我是不同意C语言里随意的移动一个指针是未定义的行为。

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

回复 #113 zx_wing 的帖子

指针就是指针。
在32位平台上, 可以像你说的那样, 将其认为是一个数, 以帮助你理解。
但以你这么多年的实践, 依然停留在"指针就是一个数"这种认识层面上 …… 你白实践了…… 或者说, 你也就只会实践了……

上面列举的指针, 你还可以认为它们可以想象成一个数吗?
我不否认, 在解引用之前, 无论指针怎么表达, 它应该需要以某种规则转换为一个数才能够标识一个唯一的内存单元。
但不将指针理解为数, 我依然可以写程序。 除非必要, 根本不需要这种无端臆测。


你怎么解释我列出的那种模型?
你能保证所有采用segment + offset 作为指针的机器, 以及它们的编译器,都一定将 segment + offset 作为整体增减, 而不仅仅是改变offset ?
如果你还敢作这种保证, 我真没什么向对你说的了 ……

你要学的不是C,更不是实践C, 而是去学逻辑学。
除非你能找到另一条标准(如果你真找到, 洗耳恭听)。 否则你的证明方式不外乎列举你所知道的机器而已。以这种方式,能够证明这个命题吗?? 你好好想想。

论坛徽章:
0
124 [报告]
发表于 2009-12-17 22:02 |只看该作者

回复 #118 OwnWaterloo 的帖子

抱歉,我没仔细看回帖

只是觉得:为啥“未定义行为”是“为定义行为”?
一方面,C标准考虑的平台不限于x86+win32,可能包括DSP。这个问题可能依赖内存分配的方式
另一方面,“未定义行为”是否也允许了编译器自定义这些行为,然后利用这些特性呢

比如说,某个圈子,做特定一个领域的圈子,没准就流行这个用法
在比如,内存统一编址的平台,可能选一个地址作为原点,然后用+1,-1确定其他设备的地址

写代码的时候知道自己在干啥就行了

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

回复 #122 zx_wing 的帖子

原帖由 zx_wing 于 2009-12-17 21:56 发表
>>无法证明所有机器 offset 都一定不会回绕。
这个想法确实很新颖。是无法证明,世界上没有任何一句话可以说绝。


那不就结了?
现在你觉得103楼的言论是不是过于大胆了?

原帖由 zx_wing 于 2009-12-17 21:56 发表
我绝对就事论事的

我看过你很多回帖, 所以对你今天的表现非常不解。


比如你依然坚持:
原帖由 zx_wing 于 2009-12-17 21:56 发表
我就不讨论这个问题了。我只讨论有实际例子的东西,我个人不善于讨论纯理论。
但无论如何,我是不同意C语言里随意的移动一个指针是未定义的行为。

是否会出现overflow? 这个问题是没有确切答案的。 —— 这难道还不算未定义行为?

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

回复 #124 reiase 的帖子

原帖由 reiase 于 2009-12-17 22:02 发表
写代码的时候知道自己在干啥就行了


对, 就是要有个度。
并不是一定要完全按照标准写, 一定只使用有良好定义的特性。 那太极端了。
但是, 明明可以依赖标准中有良好定义的行为就可以写出程序, 确非要去使用未定义行为, 这也是一种极端。

所以我很在意lz的case到底是什么, 是不是越界代码就不能写了。
如果真是这样, 那越界好了, 移植的时候注意这里即可, 知道自己在干啥就行
如果不越界也能写代码, 少一个移植时检查点, 岂不更好?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
127 [报告]
发表于 2009-12-17 22:22 |只看该作者
这个帖子还真火了。

真想不出 啥编译器这么变态会把一个 不解引用的野指针 怎么样,根据标准的那句话 是未定义行为,

但...那又怎样,如果确实需要,真的有必要完全准寻标准?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
128 [报告]
发表于 2009-12-17 22:25 |只看该作者
指针就是指针。
在32位平台上, 可以像你说的那样, 将其认为是一个数, 以帮助你理解。
但以你这么多年的实践, 依然停留在"指针就是一个数"这种认识层面上 …… 你白实践了…… 或者说, 你也就只会实践了……

-------------------------------------------------------------------------------
似乎我也白学了,在我看来,任何数据都只是数而已................

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

论坛徽章:
0
130 [报告]
发表于 2009-12-17 22:27 |只看该作者

回复 #126 OwnWaterloo 的帖子

这又涉及到:为啥使用的"标准中有良好定义的行为"的问题。
你跟只做VC开发的人讨论“标准中有良好定义的行为”没有意义,同样和Linux内核程序员讨论GCC以外的编译器也没啥意义。

标准,只是个建议,没有约束力的。资格老的程序员,凭经验告诉你,最好用“标准中有良好定义的行为”。
但是,没有哪家保险公司卖这个保险的——你看VC6下那么多与标准相悖的行为,不照样活得好好地。

恩,还有,不一定所有的程序代码都是人写的,还有代码生成器生成的,可能人家为了计算下标方便就直接使用负下标呢
所以我觉得这个问题无所谓,顶多有几个刚知道负下标的小毛孩为此写两段“证明自己聪明的程序”
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP