| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 308697 人关注过本帖, 10 人收藏
标题:关于C标准
取消只看楼主 加入收藏
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有时间我会逐点在原楼层加上评论和解释。

授人以渔,不授人以鱼。
2013-08-11 19:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用abc594986308在2013-8-14 22:03:27的发言:

ANCI C以前的C已经没了吧,现在都是标准。。。标准满天飞。。

请仔细阅读2楼和4楼

授人以渔,不授人以鱼。
2013-08-15 11:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
喜欢拿《标准》说事的,尤其应留意2楼。

授人以渔,不授人以鱼。
2014-07-08 12:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用八画小子在2014-12-11 15:24:57的发言:

我们国家也有有关C语言的标准,是GB/T 15272-94。不过这个标准仅仅等同ISO/IEC 9899-1990的C语言标准。
按理来说看了中文的好理解英文的标准,但为啥我看了英文的标准之后才能理解中文的说了些啥东东呢?

翻译的好坏问题

授人以渔,不授人以鱼。
2014-12-12 16:33
快速回复:关于C标准
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056727 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved