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 <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;
    }

输出: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值