免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
441 [报告]
发表于 2012-09-05 14:39 |只看该作者
回复 437# Ager

先说"人生攻击"那帖,我记错了,不是你发的。。。
提到这个是想说:一开始开到你的回帖,我直觉上感到里面有什么不对。然后从"产生代码不相同->代码不等价"开始,推出"相同表达式也不等价",发现原来这逻辑这么荒唐。然后就这么写了,顺手又发了。

发过之后又读了读,感觉攻击性太强,所以就在后面解释了一通。



至于发生在哪一步。先说一般化的情况,编译器不一定是一个密不可分的整体。

有一种可能的设计是:
1. 一部分是将源代码转换到中间代码
2. 另一部分再从中间代码转换到目标代码
中间代码可能与源代码相差很大,也有可能就是源代码的一个子集。而且中间代码不一定只有一步。
甚至可以从另一个角度来看这件事:对最终用户来说编译器是L->T语言,但编译器本身可能是L->L0->L1->...->T。

每一层得到的输入是上一层转换后的输出,已经看不到原样了,察觉不到区别了。



举一些差别不大的例子。

  1. -- 不需要分号,但需要对齐
  2. let x = 12
  3.     y = 26
  4. in x + y

  5. -- 转换成这样,不需要对齐(虽然写的是对齐了的),但需要分号
  6. let { x = 12
  7.     ; y = 26 }
  8. in x + y

  9. -- 对齐不是强制的,甚至还可以在一行
  10. let { x = 12 ; y = 26 } in x + y

  11. -- 这是列表
  12. [1,2,2,6]
  13. -- 被转换成通过(:)以及[]构造
  14. 1:2:2:6:[]

  15. -- 这是字符串
  16. "1226"
  17. -- 被转换成Char的列表
  18. '1':'2':'2':'6':[]
复制代码
这些转换都是语言spec里面写了的。
Haskell has adopted many of the convenient syntactic structures that have become popular in functional programming.
In this Report, the meaning of such syntactic sugar is given by translation into simpler constructs.
If these translations are applied exhaustively, the result is a program written in a small subset of Haskell that we call the Haskell kernel.

http://www.haskell.org/onlinereport/intro.html#sect1.2

上面两种转换的定义在:
2.7  Layout: http://www.haskell.org/onlinereport/lexemes.html#sect2.7
3.7  Lists: http://www.haskell.org/onlinereport/exps.html#sect3.7

被转换后的代码依然是合法的,是转换前的一个子集,写起来更困难。



而转换后差别很大的例子,Haskell kernel到GHC(Haskell的一个编译器) core就是。已经不是合法的Haskell代码了。我也手写不出来。。。



无论差别有多大,下层的都看不到上层的区别。
Haskell kernel->GHC core这个stage不知道Haskell源代码是怎么写的,是[1,2]还是1:2:[]。它只看得到后者。
GHC core -> asm这个stage也不知道core是由怎样的kernel转换来的。
所以[1,2]与1:2:[]是等价的。如果产生的最终代码不一样,肯定是其他原因造成的,不会是[1,2]与1:2:[]的写法不同造成的。



这种将core写进spec的语言不算少。
但其他许多语言虽然没做到这一步,也还是在局部有点这种意思的,它们把这个叫做语法糖。写起来舒适,但效果不变。



回到C。spec只说了p[x]是根据*(p+x)定义,没说后者一定是中间格式,没有将那个转换写进spec。
不过这样的转换并不是很困难的事情,没理由让两者产生不一样的代码。
我基本上不写*(p+x)的,大都写p[x]。而p[x]你列出的两种转换方式我都见过。就是说,这不一定是因为*(p+x)的原因,而是p[x]本身就有可能翻译为不同的代码。

论坛徽章:
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
442 [报告]
发表于 2012-09-06 08:08 |只看该作者
OwnWaterloo 发表于 2012-09-05 14:39
回复 437# Ager

先说"人生攻击"那帖,我记错了,不是你发的。。。


没事儿,呵呵{:3_193:}

论坛徽章:
0
443 [报告]
发表于 2012-09-07 23:10 |只看该作者
回复 4# wolf5729


    楼主那个是对的, 5*i  代表的是第 i 行 再 +j  代表的就是第 i 行的第 j 列  刚刚好就是那一个位置.

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

论坛徽章:
0
445 [报告]
发表于 2012-09-14 16:20 |只看该作者
回复 1# pmerofc


    你这个能遍历吗?只能遍历第一行还可以吧???
    我得调试一下...

论坛徽章:
0
446 [报告]
发表于 2012-09-20 08:12 |只看该作者
正确的写法                     

论坛徽章:
0
447 [报告]
发表于 2012-11-08 18:46 |只看该作者
所以结论是手工处理数组指针无法保证float数组地址对齐么?
另外,即便它有一天变成对的了,我也不会用这种写法的。。。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
448 [报告]
发表于 2012-11-15 18:06 |只看该作者
本帖最后由 starwing83 于 2012-11-15 18:09 编辑

回复 441# OwnWaterloo


    p[i]根据*(p+i)定义,就意味着编译器(下层)看不到p+i和p[i]的区别,这难道不是你说的转换的含义?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
449 [报告]
发表于 2012-11-15 18:47 |只看该作者
回复 448# starwing83

能看完帖再回么。。。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
450 [报告]
发表于 2012-11-15 20:11 |只看该作者
回复 449# OwnWaterloo


    我不明白,事实上[]语法就是一个语法糖而已。还有别的么?另外*&和&*据定义也是语法糖。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP