• C专家编程 第1章 C:穿越时空的迷雾 1.4 K&R 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
    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
        //epsilon.=0001;
        printf("epsilon = %f\n", epsilon);
        int value = 3, open = 4;
        bool result = value =! open; /*value被设置成open的逻辑反*/
        printf("!open = %d\n", !open);
        printf("result = %d\n", result);
        result = value != open;      /*value与open进行不相等比较*/
        printf("result = %d\n", result);
         
        return 0; 
    }

    /* 输出:

    */ /*看来现在不存在以前的问题了*/ 

  • 相关阅读:
    Grafana升级到9.0.7
    小国王(目标状态优化版)—— 状态压缩DP
    Linux 离线安装mysql
    数据可视化之工具
    ESP32/ESP8266在线刷写Sonoff Tasmota固件以及配置简要
    自建视频托管平台:MediaCMS
    网格化覆盖·智能化管控·数字化通行|公租房智能门锁有一套!
    mysq基础语句+高级操作(学这篇就够了)
    分布式消息队列:Rabbitmq(2)
    设计模式简介
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126068210