免费注册 查看新帖 |

Chinaunix

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

[C] 有多少C程序员认为这是错误的写法 [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
391 [报告]
发表于 2012-09-03 20:22 |只看该作者
@pmerofc

pmerofc 发表于 2012-05-11 21:36
回复 15# OwnWaterloo

我觉得构成一维数组的元素是float
因此指向float的指针如果超出了一维数组就构成了一种越界


至于本帖的真正关键,楼主pm大虾你已经在第18楼彻底揭示。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
392 [报告]
发表于 2012-09-03 20:37 |只看该作者
本帖最后由 Ager 于 2012-09-03 20:37 编辑
pmerofc 发表于 2012-06-12 18:22
换句话说
这是否是一种未定义行为
未定义行为在很多情况下都能编译通过
并且“显得”很正常


说到“未定义行为”,这个词也得定义(或约定)一下。

在C标准中,涉及“未定义行为”范畴的,至少有三种条款:Implementation-defined、Undefined、Unspecified。

那么,首先得找出,楼主pm大虾的问题,到底会触发哪一种(些)条款的适用条件(可能会多重或嵌套触发) …… 我直觉,这恐怕不是那么简单。


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

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

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
395 [报告]
发表于 2012-09-03 20:57 |只看该作者
本帖最后由 Ager 于 2012-09-03 20:58 编辑
OwnWaterloo 发表于 2012-05-12 21:08


p[x]与*(p+x)?还性能比较? 它们是等价的,知道吗?


这里,我觉得,又出现了麻烦事情 ……

这里的“性能”,到底指什么?是按照源代码被编译的速度为指标?还是被链接的速度?被装载的速度?或是程序被执行的速度?(解释型语言,在这个问题上,就容易许多了。)

“等价”的观念又该如何理解?被比较的两方,将在哪一个层面上被做关于“等价”的判断?

至于walleeee提到的“p[x]、*(p+x),这2个性能的比较,第二个要稍微快一些”,我就有些糊涂 …… 至少,从gcc编译出的指令看 ……
  1. int x=2;
  2. 804839a:       c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%ebp)
  3. p[x]=123;
  4. 80483a1:       8b 45 fc                mov    -0x4(%ebp),%eax
  5. 80483a4:       c7 44 85 e8 7b 00 00    movl   $0x7b,-0x18(%ebp,%eax,4)
  6. 80483ab:       00
复制代码
  1. int x=2;
  2. 804839a:       c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%ebp)
  3. *(p+x)=123;
  4. 80483a1:       8b 45 fc                mov    -0x4(%ebp),%eax
  5. 80483a4:       8d 14 85 00 00 00 00    lea    0x0(,%eax,4),%edx
  6. 80483ab:       8d 45 e8                lea    -0x18(%ebp),%eax
  7. 80483ae:       01 d0                   add    %edx,%eax
  8. 80483b0:       c7 00 7b 00 00 00       movl   $0x7b,(%eax)
复制代码
呵呵,以上,仅供参考 …… :)

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
396 [报告]
发表于 2012-09-03 21:05 |只看该作者
本帖最后由 Ager 于 2012-09-03 21:12 编辑
pmerofc 发表于 2012-09-03 20:42
后面两种
一般称为“实现定义行为”和“未规定行为”.


赞 —— :)

现在,就可以确定,楼主pm大虾你所提到的问题,按照你的实旨,可以转换为以下表述:
  1. float score[4][5],*pscore = *score ;
  2. ……
  3. …… ( pscore + 5 * i + j )……;
  4. ……
复制代码
这样的程序代码,是否会触及Undefined行为?

—— 可以这麽表述吗? —— 如果可以的话,那么问题就清楚许多了。

不过,我还是有个问题:这样的程序代码,会不会触及Implementation-defined行为或Unspecified行为?这个如何判断和论证呢?

也就是说,“指向float的指针如果超出了一维数组就构成了一种越界”这个命题,是如何对应了Implementation-defined、Undefined和Unspecified这三种中的某一种的?




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

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

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
399 [报告]
发表于 2012-09-03 21:26 |只看该作者
本帖最后由 Ager 于 2012-09-03 21:30 编辑
pmerofc 发表于 2012-09-03 21:13
回复 396# Ager

    一般来说
    按我的理解
    Implementation-defined行为 编译器要给出文档说明
   Unspecified行为 则是标准明确规定 编译器 可以随意处置的正确行为


赞 —— :)

那么,这是否意味着:“指向float的指针如果超出了一维数组就构成了一种越界”这个命题(所涉及的行为),已经在排除在“在编译器文档中被说明的行为”的范围以及“不在编译器文档中被说明却可以被编译器现场自由处置(语言标准赋予编译器方面权利)的行为”的范围之外了?

我想,很可能是的。

还有,主帖中的代码,是否真的符合“指向float的指针如果超出了一维数组就构成了一种越界”这个命题(代码是否构成了“超出”)?又及,这个命题本身是否正确(这种“超出”是否构成了“越界”)?

关于这两个问题,我倾向于:楼主你的理解,都是对的:)






论坛徽章:
0
400 [报告]
发表于 2012-09-03 21:35 |只看该作者
回复 398# pmerofc


    又看了看, 好像 for (;;p = (float*)((char*)p+sizeof(float))) 是能正常遍历的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP