标题:关于C标准
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
3.7 是否有自动比较结构的方法?

没有。编译器没有简单的好办法实现结构比较 (即, 支持结构的 == 操作符), 这也符合 C 的低层特性。 简单的按字节比较会由于结构中没有用到的 ``空洞'' 中的随机数据  (参见问题 2.10) 而失败; 而按域比较在处理大结构时需要难以接受的大量重复代码。

如果你需要比较两个结构, 你必须自己写函数按域比较。

参考资料: [K&R2, Sec. 6.2 p. 129]; [Rationale, Sec. 3.3.9]; [H&S, Sec. 5.6.2 p. 133]。

授人以渔,不授人以鱼。
2013-08-11 13:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
4.2 使用我的编译器,下面的代码  int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?

尽管后缀自加和后缀自减操作符 ++ 和 -- 在输出其旧值之后 才会执行运算, 但这里的``之后"常常被误解。没有任何保证 确保自增或 自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进 行。也不能保证变量的更新会在表达式 ``完成" (按照 ANSI C 的术语, 在下一个 ``序列点" 之前, 参见问题 3.7) 之前的某个时刻进行。 本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。

包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, ``多个不确定副作用" 是指在同一个表达式中使用导致同一对象修改两 次或修改以后又被引用的自增, 自减和赋值操作符的任何组合。这是一 个粗略的定义; 严格的定义参见问题 4.7, ``未定义" 的含义 参见问题 11.32。) 甚至都不要试图探究这些东西在你的编译 器中是如何实现的 (这与许多 C 教科书上的弱智练习正好相反); 正如  K&R 明智地指出, ``如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你。begintex2html_deferred

参考资料: [K&R1, Sec. 2.12 p. 50]; [K&R2, Sec. 2.12 p. 54]; [ISO, Sec. 6.3]; [H&S, Sec. 7.12 pp. 227-9]; [CT&P, Sec. 3.7 p. 47]; [PCS, Sec. 9.5 pp. 120-1]。

授人以渔,不授人以鱼。
2013-08-11 13:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
6.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?

C 程序员传统上喜欢知道很多 (可能比他们需要知道的还要多) 关于机器实现的细节。 空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。 而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机 器上会改变。``if(p == 0)" 这种结构又很容易被误认为在比较之前把 p 转成了整 数类型, 而不是把 0 转成了指针类型。最后, 术语 ``空" 的几种用法 (如上文 问题 6.10 所列出的) 之间的区别又可能被忽视。

冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样, 用  ``nil") 作为空指针常数。编译器要么在源代码没有歧义的时候把 ``nil" 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常 数关键字不是 ``nil" 而是 ``0", 这在多数情况下都能正常工作, 除了一个未加修饰 的 ``0" 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。

授人以渔,不授人以鱼。
2013-08-11 13:29
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
大致浏览了一下...回个帖发表一下自己的感慨...顺便做个mark...

从C专家编程里面看的...
大致意思就是说:
首先C语言是针对程序员的语言(那时候程序员的概念和现在不一样)...设计之初就认为你自己熟知自己写下的每一行代码的作用...
所以C标准只限定了在正常使用的范围内,各个语句是什么作用...
而非正常使用,标准并未涉及,各个编译器可以自行实现...

我个人认为...算是总结吧...
C成也灵活,败也灵活...(当然,我说的败指的是很多人花上三五年也未必能有大成...)

刚毕业的时候,我的简历写的"能熟练运用C和C++语言"
过了两年,我改成了"能运用C和C++语言编程"
现在,我出去介绍自己一般说"会一点C和C++语言,理解不深,偶尔还是避免不了内存泄漏..."

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-11 17:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
有时间我会逐点在原楼层加上评论和解释。

授人以渔,不授人以鱼。
2013-08-11 19:28
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
得分:0 
这个必须顶!大致看了一下,很不错,晚上回去好好看一下!


版主不是一般的大牛,佩服

[ 本帖最后由 liufashuai 于 2013-8-12 10:56 编辑 ]

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2013-08-12 10:55
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
得分:0 
膜拜楼主
2013-08-12 12:39
Jonboy
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-8-9
得分:0 
先赞一个
2013-08-13 11:34
lwb603569640
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:283
专家分:436
注 册:2012-11-9
得分:0 
我去,给的链接  翻墙才能上。。。。活在天朝真悲催

自由、民主、宪政!
2013-08-13 12:29
abc594986308
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
得分:0 
ANCI C以前的C已经没了吧,现在都是标准。。。标准满天飞。。
2013-08-14 22:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418918-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.211890 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved