zoukankan      html  css  js  c++  java
  • 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(一)

    挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(一)

    《C程序设计(第四版)》(后面简称《谭C》)的版权页的内容简介中写到:

    “本书按照C语言的最新标准C99进行介绍,所有程序都符合C99的规定,使编写程序更加规范”

    封底霍然写着:

    “按照C99标准进行介绍,以适应C语言的发展,使程序更加规范。”

    很多初学者看到这些欢天喜地地以为自己也咸与维新了,因为学的也是最新的C99了(注:C语言最新标准其实是C11)。实际上这两句话深有玄机。

    那两句话的真正含义究竟是什么呢?要想知道这个问题答案,需要首先了解标准的更迭意味着什么。

    一个新标准取代旧标准,无外乎包括四种情况:1.增加了新内容;2.废止了旧内容;3.修改了旧内容;4.和旧标准保持一致。

    和旧标准一致的情况显然很多,有很多东西自从C语言诞生以来压根就没变过,比如if语句的写法,定义变量的方法,……数不胜数的情况都属于在任何标准下都是完全一样的。因此哪怕最古老的代码中也有相当大的一部分有资格说符合最新C语言标准。

    所以,即使是在C89标准年代写的书,只要内容中没涉及被C99废止了内容也没涉及被C99改变了的内容,那么你也不能说它违背了C99标准。但是能否说它是“按照”C99标准呢?这确实有点成问题,不过《谭C》并不属于这种情况。

    《谭C》在一开始讲到修订原因时讲它所谓的“按照C99标准介绍”,是:

      数据类型介绍中,增加了C99扩充的双长整型(long long int)、复数浮点型(float complex,double complex ,long long complex)、布尔型(bool)等,使读者有所了解。——p12

    然而实际上C99不但增加了long long int类型,还增加了unsigned long long int类型;C99中根本就没有long long complex类型,也没有bool类型。

    同页中:

      C99要求,main函数的类型一律指定为int型,并在函数的末尾加一个返回语句“return 0;”。——p12

    然而实际上是C89要求main函数的返回值类型只能是int类型,C99放宽了这种要求,并没有要求main函数的类型一律指定为int型。C99只是要求int必须明确写出,而C89则没有要求必须明确写出int,但不写的含义等同于返回值为int类型。

    C99程序中main函数体内可以不加return 0;,表示的含义依然是return 0;C89下的程序,main函数体内必须写return 0;,否则返回的是无意义的值。

    《谭C》硬把main函数的返回值类型是int类型,main函数体内必须写return 0;这两个C89的规定说成是C99的新规定,是在刻意粉饰《C程序设计(第三版)》main()的荒腔走板:

    void main(){}

    《C程序设计(第三版)》对此振振有词地讲到:“main前面的void表示此函数是空类型void是‘空’的意思,即执行此函数后不产生一个函数值”(p3)

    void main()是哪个标准的规定呢?对不起,没有任何一个标准讲main()可以这样写。这种写法是错误的。为了掩饰这个错误,《谭C》编造了一个弥天大谎,硬把int main()和return 0;说成是C99的要求。

    同页:

    由于C99是在C89的基础上增加或扩充一些功能而成的,因此C89C99基本上是兼容的。用C89编写的程序在C99环境下仍然可以运行。——p12

    “贼人不打,三天自招”,在这里这本书把自己的企图说得明明白白,它想走的路子主要是用C89与C99完全一致的内容来冒充C99。但它却完全没想到,C99除了增加新内容外,还废除了C89的某些条款或修改了某些条款。

    C99所增加的有些新的功能和规则,是在编制比较复杂的程序时为方便使用和提高效率而用的,本书对目前暂时用不到的内容不作介绍——p12

    前半句是在无知+臆想基础上造的谣言,后半句羞羞答答地告诉你“按照C99标准”是在逗你玩。

  • 相关阅读:
    IntelliJIDEA永久注册使用
    并行设计模式(二)-- Master-Worker模式
    Guava之CaseFormat
    solr6.3.0升级与IK动态词库自动加载
    算法思维
    并发库应用之一 & ThreadLocal实现线程范围的共享变量
    filecoin里程碑事件
    博客园 增加打赏功能
    session-token-cookie讲解
    golang原生的RPC实现
  • 原文地址:https://www.cnblogs.com/pmer/p/4006697.html
Copyright © 2011-2022 走看看