免费注册 查看新帖 |

Chinaunix

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

拙著《狂人C》出版,特邀CU网友垂注,并欢迎品头论足、批评指正 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-12-10 21:09 |显示全部楼层
不,我是指 Annex D (normative) Universal character names for identifiers
KBTiller 发表于 2010-12-08 20:16

是我弄错了。。。我引用的那个算是扩展情况。

关于可读性……其实用拼音缩写还不如用拼音全写,用拼音全写还不如用中文……不过UCN标识符不见得被编译器广泛支持,而且会产生潜在的兼容性问题。
所以要么用英文要么把拼音写全,其它的方案看起来都有很大问题——除非能保证看过简写的代码阅读者能够记全这些标识符的意义。

论坛徽章:
0
12 [报告]
发表于 2010-12-10 21:43 |显示全部楼层
能否详细说说有什么不同?
KBTiller 发表于 2010-12-08 22:35


通常意义上的address,可以认为是指存储器编址的一种简单的数学模型(地址空间)中的元素,也就是一个(非负的)整数。
C语言中的address constant(C++所说的address类似)是指指针(类型的实例)——
ISO C99 6.4.2:
Anaddress constant is a null pointer, a pointer to an lvalue designating an object of static
storage duration, or a pointer to a function designator; it shall be created explicitly using
the unary & operator or an integer constant cast to pointer type, or implicitly by the use of
an expression of array or function type.
显然,address constant是有类型的,和指针的运算规则相关。作为整数(数学概念)的地址,和指针运算的规则无关。
讨论C语言问题,要是单独说address,也没多大问题。只是应当注意C语言中没有再定义address的概念,address仍然应该指的是不考虑类型的整数。初学者如果不注意,可能会把两者混用——特别是用“地址”同时作为这两个不同概念的中文表述。
这显然是有问题的。例如:
int a[2] = {1};
要是说&a[0]得到的是一个“地址”(字面的说,是address,但严格意义上不是——它的类型在这里不能被忽略),那么“&a[0]+1的值是多少”这类问题可能就弄不清了。
其实还有一个问题,就是关于address constant中constant的意义。“地址常量”本身在字面上是没问题的,问题在于——很难描述C语言中所说的“常量”是什么,除非枚举外延(C语言中的常量包含地址常量、字符常量……)。因此有人反对使用“地址常量”这个译名(address constant是标准中定义的,大概不好反对;尽管这种定义确实很奇怪,容易产生误解),而用“地址”代替。上面已经提到过,C语言没有特别规定地址是什么,要表达“地址空间中的一个整数”这个意义时,“地址”是没有问题的;但是若在只能用address constant而不能用address的场合中用“地址”代替address constant,那就是一种误用。这种误用似乎还挺常见。于是学习者更加容易弄不清了。
(PS.我个人认为address constant是C语言中不必要出现的概念,直接用pointer来描述就行了——当然另外还要补充一下operator&的语义描述,如ISO C++风格的“unary operator & returns a pointer”之类。)

你的意思是学了计算机原理之类的基础课程,学习C更难了?
mirnshi 发表于 2010-12-09 10:55


在这些个别的概念上确实是这样。
另外,使用思维方式有较大的不同,也可能会造成一定的困难。不过这些课程本来就是要解决属于不同的领域(尽管有些相关)的问题,所以学习者应该可以理解到差异而不至于造成很大麻烦。

论坛徽章:
0
13 [报告]
发表于 2010-12-11 11:47 |显示全部楼层
从这种字面上去理解指针或地址,是无法解释得非常清楚的。计算机更多的是实践。有了计算机基础,建立起 ...
mirnshi 发表于 2010-12-11 00:26


这种从字面上去理解当然很有问题,但是为什么会使人容易误解呢?某种意义上来说,C语言的理论体系难逃其咎。
计算机领域实践固然重要,但不代表使理论更清晰(以便能更好地帮助实践)的工作本身是可以被其它的实践取代的。
语言的实现帮助把源语言翻译成目标代码,把源代码的语义翻译成目标代码的操作语义——于是语言的使用者可以不必了解具体的每一个操作语义(例如汇编代码表述)。直接寻址、间接寻址这些概念是一类操作语义的抽象,但不是使用和机器无关的公理或指称描述的,受限于具体的实现模型和平台(尽管现在看起来是个计算机就可以在上面套用直接寻址之类的概念- -),这一般和用高级语言源代码直接表达的语义是有相当距离的。如果要求每个使用者都尽可能理解这些语言之外、实现相关的操作语义细节才能保证正确使用一门高级语言的话,那么“高级”就失去了一部分意义。(话说C语言不那么“高级”,有一点就是体现在这里。)

“有了直接寻址、间接寻址这些概念很容易理解指针,有了一些计算机部件硬件知识,更容易理解位操作。鲜有听说将这些计算机基础理论与计算机语言搞混的,相对熟悉其他语言的,熟悉C的对计算机的细节更加了解和熟悉。”——当然我也同意这个实践中得到的经验。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP