C专家编程 第1章 C:穿越时空的迷雾 1.4 KR C
时间:1978
人物:Steve Johnson
事件:编写了pcc这个可移植的C编译器
影响:形成了一代C编译器的基础。
C语言的演化之路如图1-2所示。
1973-3(早期的C)--->1976-9(K&R C)--->1983-9(ANSI C)(1) --->1967(Simula 67)(2) 1983(Ada)(3)
(1)(2)(3)共同形成1985-9(C++)
软件信条
一个非比寻常的Bug
C语言从Algol-68中继承了一个特性,就是复合赋值符它允许对一个重复出现的操作只写一次而不是两次,并给代码生成器一个提示,即操作数寻址也可以这么紧凑。复合赋值符最初的写法是先写赋值符,再写操作符,B语言的词法分析器里面有个技巧,使实现=op比实现目前所使用的op=形式更简单些,但这种形式会引起混淆,它很容易把
b =- 3; //从b中减去3
和
b = -3; //把-3赋给b
搞混淆。
因此,这个特性被修改为目前所使用的这种形式。作为修改的一部分,代码格式器程序indent
也做了相应修改,用于确定复合赋值符的过时形式,并交换两者的位置,把它转换为对应的标准
形式。这是个非常糟糕的决定。
任何格式器都不应该修改程序中除空白之外的任何东西。令人不快的是,这种做法会引入一个Bug,就是几乎任何东西(只要不是变量),如果出现在赋值符后面,就会与赋值符交换位置。
这个Bug可能会引起语法错误,如
epsilon=.0001;
会被交换成
epsilon.=0001;
这条语句无法通过编译器,你马上就能发现错误。
value=!open; //value被设置成open的逻辑反
会悄无声息地交换成
value!=open; //value与open进行不相等比较
这条语句会通过编译,它并不改变value的值。
#include <stdio.h>
int main() {
int b = 5;
b=-3; /*从b中减去3*/
printf("b = %d\n", b);
b=-3; /*把-3赋给b*/
printf("b = %d\n", b);
double epsilon=.0001;
printf("epsilon = %f\n", epsilon);
/*
** can't pass the compiliation
** because of [Error] expected unqualified-id before '=' token
** epsilon.=0001
*/
printf("epsilon = %f\n", epsilon);
int value = 3, open = 4;
int result = value=!open; /*value被设置成open的逻辑反*/
printf("!open = %d, value = %d, result = %d\n", !open, value, result );
result = value != open; /*value与open进行不相等比较*/
printf("open = %d, value = %d, value != open = %d, result = %d\n", open, value, value != open, result );
return 0;
}
输出:
C专家编程 第1章 C:穿越时空的迷雾 1.4 KR C相关推荐
- C专家编程 第1章 C:穿越时空的迷雾 1.9 阅读ANSI C标准,寻找乐趣和裨益
阅读ANSI C标准,寻找乐趣和裨益 int foo(const char **p) { } 编译这段代码,编译器会发出一条警告信息: int main(int a ...
- C专家编程 第6章 运动的诗章:运行时数据结构 6.1 a.out及其传说
运动的诗章:运行时数据结构 编程语言理论的经典对立之一就是代码和数据的区别.有些语言(如Lisp)把二者视为一体.其他语言(如C语言)通常维持两者的区别.Internet蠕虫非常难以被人们所 ...
- 《C专家编程》第二章——这不是Bug,而是语言特性
无论一门语言有多么流行或多么优秀,它总是存在一些问题,C语言也不例外.本章讨论的重点是C语言本身存在的问题,作者煞费苦心的用一个太空任务和软件的故事开头,也用另一个太空任务和软件的故事结尾,引人入胜. ...
- C专家编程 第11章 你懂得C,所以C++不再话下 11.1 初识OOP
C++之于C,就像Algol-68之于Algol ---David L.Jones 如果你觉得C++还不够复杂,那你知道protected abstract virtual ...
- C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组
使用指针创建和使用动态数组 当预先并不知道数据的长度时,可以使用动态数组.绝大多数具有数组的编程语言都能够在运行时设置数组的长度.它们允许程序员计算需要处理的元素的数目,然后创建一个刚好能容纳 ...
- C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.2 根据位模式构筑图形
根据位模式构筑图形 图标(icon)或者图形(glyph)是一种小型的位模式映射于屏幕后产生的图像.一个位表示图像上的一个像素.如果一个位被设置,那么它所代表的像素就是"亮" ...
- 《C专家编程》1-2章阅读收获
一. C诡异离奇,缺陷重重,却获得了巨大的成功. ·编译器设计:效率(几乎)就是一切.编译器的效率包括两个方面:运行效率(代码的运行速度)和编译效率(产生可执行代码的速度). 除了开发和学习环境外,运 ...
- C专家编程 第6章 运动的诗章:运行时数据结构 6.3 操作系统在a.out文件里干了些什么
操作系统在a.out文件里干了些什么 为什么a.out要以段的形式组织.段可以方便地映射到链接器在运行时可以直接载入的对象中!载入器只是取文件中的每个段的映像,并直接将它们放入到内存中.从本 ...
- C专家编程 第11章 你懂得C,所以C++不再话下 11.13 多态---运行时绑定
多态---运行时绑定 多态(polymorphism)源于希腊语,意思是"多种形状".在C++中,它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当 ...
最新文章
- 深度学习中的优化算法之BGD
- centos7 pam mysql.so,Centos7下搭建FTP服务器(博主亲测不坑)
- [转]制作BlogWriter 博客客户端
- 静态网页和动态网页的区别(转载)
- 计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介
- 使用Frigga实现WEB方式对服务的监控
- paip.提升用户体验-----用户注册设计
- pitch、yaw、roll三个角
- 几个特别棒的免费可商用字体
- 2018年最新_5小时学会微信小程序视频教程网盘地址
- linux命令关闭浏览器,linux命令行浏览器的使用方法
- shell 脚本实战 四
- 登录服务器手机验证码不正确,解决织梦后台登录一直提示验证码不正确的方法...
- 对于课程签到设置合理性的调查报告
- 基于PaddlePaddle 2.0动态图实现的CRNN文字识别模型
- 计算机控制面板属性在哪里打开,win7如何打开系统属性面板|win7打开系统属性面板的方法...
- iptables防火墙
- 一、任天堂ns (Nintendo Switch) 上手
- matlab:人脸识别
- 小程序配置服务器域名
热门文章
- 群友(淡泊、明志)总结android面试题
- CARLA 笔记(07)— 地图和导航(Landmarks、Waypoints、Lanes、Junctions、Environment Objects、路径点导航、地图导航、分层和非分层地图)
- Python——伪随机数生成器
- Flume或Kafka和Elasticsearch整合
- java8 collectors_java8的Collectors.reducing()
- Unity 3d 中Debug.Log和Print的区别。
- 咳咳,好久没发博客了,我还活着。(ps:又要进入鸽王模式了)
- 解决Linux MySQL报错ERROR 2002 (HY000)
- Web前端案例——学成网首页制作
- 倍福--编码器链接到虚轴,虚轴不做控制,实轴做从轴,实现电子凸轮或电子齿轮的耦合