时间: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相关推荐

  1. C专家编程 第1章 C:穿越时空的迷雾 1.9 阅读ANSI C标准,寻找乐趣和裨益

    阅读ANSI C标准,寻找乐趣和裨益      int foo(const char **p) {     }     编译这段代码,编译器会发出一条警告信息:      int main(int a ...

  2. C专家编程 第6章 运动的诗章:运行时数据结构 6.1 a.out及其传说

    运动的诗章:运行时数据结构      编程语言理论的经典对立之一就是代码和数据的区别.有些语言(如Lisp)把二者视为一体.其他语言(如C语言)通常维持两者的区别.Internet蠕虫非常难以被人们所 ...

  3. 《C专家编程》第二章——这不是Bug,而是语言特性

    无论一门语言有多么流行或多么优秀,它总是存在一些问题,C语言也不例外.本章讨论的重点是C语言本身存在的问题,作者煞费苦心的用一个太空任务和软件的故事开头,也用另一个太空任务和软件的故事结尾,引人入胜. ...

  4. C专家编程 第11章 你懂得C,所以C++不再话下 11.1 初识OOP

    C++之于C,就像Algol-68之于Algol          ---David L.Jones     如果你觉得C++还不够复杂,那你知道protected abstract virtual ...

  5. C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组

    使用指针创建和使用动态数组     当预先并不知道数据的长度时,可以使用动态数组.绝大多数具有数组的编程语言都能够在运行时设置数组的长度.它们允许程序员计算需要处理的元素的数目,然后创建一个刚好能容纳 ...

  6. C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.2 根据位模式构筑图形

    根据位模式构筑图形     图标(icon)或者图形(glyph)是一种小型的位模式映射于屏幕后产生的图像.一个位表示图像上的一个像素.如果一个位被设置,那么它所代表的像素就是"亮" ...

  7. 《C专家编程》1-2章阅读收获

    一. C诡异离奇,缺陷重重,却获得了巨大的成功. ·编译器设计:效率(几乎)就是一切.编译器的效率包括两个方面:运行效率(代码的运行速度)和编译效率(产生可执行代码的速度). 除了开发和学习环境外,运 ...

  8. C专家编程 第6章 运动的诗章:运行时数据结构 6.3 操作系统在a.out文件里干了些什么

    操作系统在a.out文件里干了些什么      为什么a.out要以段的形式组织.段可以方便地映射到链接器在运行时可以直接载入的对象中!载入器只是取文件中的每个段的映像,并直接将它们放入到内存中.从本 ...

  9. C专家编程 第11章 你懂得C,所以C++不再话下 11.13 多态---运行时绑定

    多态---运行时绑定     多态(polymorphism)源于希腊语,意思是"多种形状".在C++中,它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当 ...

最新文章

  1. 深度学习中的优化算法之BGD
  2. centos7 pam mysql.so,Centos7下搭建FTP服务器(博主亲测不坑)
  3. [转]制作BlogWriter 博客客户端
  4. 静态网页和动态网页的区别(转载)
  5. 计算机辅助项目管理课程方案,天津大学计算机辅助管理研究生课程简介
  6. 使用Frigga实现WEB方式对服务的监控
  7. paip.提升用户体验-----用户注册设计
  8. pitch、yaw、roll三个角
  9. 几个特别棒的免费可商用字体
  10. 2018年最新_5小时学会微信小程序视频教程网盘地址
  11. linux命令关闭浏览器,linux命令行浏览器的使用方法
  12. shell 脚本实战 四
  13. 登录服务器手机验证码不正确,解决织梦后台登录一直提示验证码不正确的方法...
  14. 对于课程签到设置合理性的调查报告
  15. 基于PaddlePaddle 2.0动态图实现的CRNN文字识别模型
  16. 计算机控制面板属性在哪里打开,win7如何打开系统属性面板|win7打开系统属性面板的方法...
  17. iptables防火墙
  18. 一、任天堂ns (Nintendo Switch) 上手
  19. matlab:人脸识别
  20. 小程序配置服务器域名

热门文章

  1. 群友(淡泊、明志)总结android面试题
  2. CARLA 笔记(07)— 地图和导航(Landmarks、Waypoints、Lanes、Junctions、Environment Objects、路径点导航、地图导航、分层和非分层地图)
  3. Python——伪随机数生成器
  4. Flume或Kafka和Elasticsearch整合
  5. java8 collectors_java8的Collectors.reducing()
  6. Unity 3d 中Debug.Log和Print的区别。
  7. 咳咳,好久没发博客了,我还活着。(ps:又要进入鸽王模式了)
  8. 解决Linux MySQL报错ERROR 2002 (HY000)
  9. Web前端案例——学成网首页制作
  10. 倍福--编码器链接到虚轴,虚轴不做控制,实轴做从轴,实现电子凸轮或电子齿轮的耦合