前文連接:踢爆IT劣書出版黑幕——由清華大學出版社之《C語言入門很簡單》想到的(2)html
拙文 《踢爆IT劣書出版黑幕——由清華大學出版社之《C語言入門很簡單》想到的》(1)、(2)發表後,獲得了很多評論。數據庫
#118樓 2013-12-31 23:23 載舟秦淮
@garbageMan
你再敢發一個清華的,信不信我弄死你全家?!編程
這種黔驢技窮式的人身威脅偏偏說明了這幫傢伙確實是在炮製技術垃圾,利用初學者的無知,用欺騙的手段謀利。也說明了這幫傢伙有多麼的卑鄙無恥,又是多麼地怯懦猥瑣。數組
揭露報道地溝油的記者李翔是被刺殺身亡的。揭露文化地溝油的薛非會如何,你們不妨拭目以待吧。ide
這是我第二次遭遇人身威脅。前一次是人民郵電出版社圖靈公司副總編陳冰發出的,由於我揭露了他策劃的劣書《C程序設計伴侶》。那段時間,我每次到超市,都喜歡在副食櫃附近轉悠,因爲那裏有菜刀。函數
此事我已經正式要求清華大學出版社給出解釋。 工具
--- 好大的口氣啊
講老實話我沒以爲我口氣有什麼大的,大約也就是實事求是罷了。我自覺講話一貫有分寸,我並無說全國除了個人《品悟C》,沒有任何一本像樣的有技術含量的C語言書。性能
其實想反駁我也很容易,列舉出另一本清華大學出版社出的像樣的有技術含量的C語言書也就是的了。開發工具
有人對我從目錄就能判斷出一本書是劣書表示懷疑:spa
僅僅從目錄一個結構體和函數的順序就能得出「《C語言入門很簡單》做者的C語言和編程水平其渣無比」的結論
其實任何一個真正懂得寫書的做者和稱職的編輯都會告訴你確實如此,甚至一個會讀書的讀者都知道這一點。這沒什麼稀奇的。
我以爲這毫無道理。
寫劣書艱難,寫好書就更艱難,憑什麼要寫書更艱難的尊重不怎麼艱難的?
一個幼兒園的孩子,不知天高地厚地去寫一本微積分的書,怎麼可能不錯漏百出坑害讀者?因此你哪怕寫得再艱難我也不會尊重你。我只尊重有水平、寫做認真、對讀者負責的做者。你是你, 我是我, 別往一塊扯。
好,回顧就到這裏。鑑於有些初學者還沒法認清這是一本劣書。因此下面看看《C語言入門很簡單》這本書的內容是何等荒腔走板的。
《C語言入門很簡單》這本書錯謬之處比比皆是,已經到了隨手一翻就能翻到的地步。
因爲錯誤太多,一次寫不完,因此今天只給出部分例子,之後再不斷補充。
另外,因爲時間所限,我將先給出槽點,之後再補充點評。
也歡迎你們對書中的各類奇葩進行點評,那樣的話,我就不用一一點評了。
第1篇 一切從基礎開始
第1章 概述
p3
提供了多種基本運算:C語言提供了30多種運算符號,分爲15個運算優先級,不只能夠完成基本的數學運算,還能夠完成相似於計算機底層操做的位運算。有的運算符號在不一樣狀況下的含義和 使用方式也是不一樣的,並且能夠經過強制結合來改變運算符的優先級。
評:這大概是在跟譚浩強學舌。就是用腳丫子數也不至於數出「C語言提供了30多種運算符號」啊。實際上C語言在二十多年前就已經有40多個運算符了。
p8
「cl.exe」是編譯器,「cl」表示「compiler」中的兩個字母,表示編譯; Visual Studio 的全稱爲Microsoft Visual Studio,意思是「微軟可視化工做室」,簡稱爲VS。它包含VB、VC、VF、Delphi、控件、數據庫ODBC等開發工具
第2章 開始c語言之旅
p24
在C語言中,有三種基本的數據類型供選擇,它們有着不一樣的精度和廣度,能夠根據本身的須要選擇合適的。這三種數據類型分別是整型、浮點型、字符型,它們可謂是C語言數據的三大變形 金剛。
p25
浮點型在C語言中主要用來表示小數,分爲單精度浮點類型和雙精度浮點類型。
表2.3 浮點類型
類型名 表示符 精度 表 示 範 圍 適合表示的數字
單精度浮點型 float 3.4×10^38 3.4×10^38到3.4×10^38 精度要求不高的小數
雙精度浮點型 double 1.7×10^308 1.7×10^308到1.7×10^308 精度要求高的小數
p27
在上一節進行變量的定義和聲明的時候,使用了兩個概念:類型名和變量名,其實它們都是C語言中的標識符。
帥絕人寰 (FUCK GFW) 評: 很驚豔!
p28
表2.4 用於命名的符號
命 名 符 號
大寫字母 A B C D E F G H I J …… W X Y Z
小寫字母 a b c d e f g h i j …… w x y z
阿拉伯數字 0 1 2 3 4 5 6 7 8 9
分隔計算符號
分隔符 ( ) { } ……. ;
計算符 + - * / % -> > < == ! …… <= >=
數 值 符 號
阿拉伯數字 0 1 2 3 4 5 6 7 8 9
指數表示符 E e
p29
const 變量擁有了常量的一切特性,用來表示常量,人們也不把它叫變量了,乾脆直接叫常量。
評:男人進了女廁所,就擁有了女人的一切特性。因此也不用把他叫男人了,乾脆直接叫女人
p30
【題目1】 「地球」是否是一個數據?
【分析】 要成爲一個數據,必須知足三個條件:首先,數據是事物元素;其次,數據
必須包含有用信息;最後,數據應該是個符號。「地球」要想成爲一個數據,就得知足這
三個條件,在描述銀河系的時候,「地球」算得上是一個事物元素。地球是銀河系的一員,
具備必定有用的信息。咱們能夠在計算機中使用漢字符號「地球」來表示。因此,對於描
述銀河系這件事情來講,「地球」是一個數據。可是,對於其餘事物,地球就不見得是數
據了!
評:有句俄國諺語:「一個傻瓜提出來的問題,十個聰明人也回答不上來」。怯怯地很想問一句,「混球」是否是一個數據。
p31
【分析】 街道上的人數是一個整數,並且數目估計會比較大,由於這每天氣不錯,風和日麗!另外,人數總不多是負的吧?所以,能夠使用unsigned long int類型來表示人數,這個類型能夠表示的整數確實大得能夠,絕對超過64億了,不會全世界的人都集中在這條街吧?!
評:這本做者和編輯都小學沒畢業,由於他們根本不會數數,有反對的嗎?
第2篇 簡單程序的構建
第3章 簡單數學運算
p35
這樣別人問你形如:
int radius = 1
的東西叫作什麼的時候,你就沒必要手足無措了,它有一個專門的名字叫作賦值表達式。
p36
scanf()函數的使用格式是這樣的:
scanf("%變量類型表示",&變量名);
在這裏,只要關注兩個點:「變量類型表示」和「變量名」。變量類型表示就是用來表示變量數據類型的一個字母
遵守上面列出的scanf()函數使用格式,%d表示要賦值的變量的類型,使用字母d表示整型
p37
printf("%變量類型表示",變量名);
p37
賦值運算是將數據的值暫時保存在變量裏,那麼,保存到變量裏到底有什麼用呢?不能只是爲了保存而保存,爲了賦值而賦值。其實,賦值也是有很大用途的,它的重要性主要體如今兩個方面:(1)爲了使用方便;(2)爲了不出錯。
p38
能夠想象一下這樣一種使用變量的狀況:定義了一個變量,沒有給它賦值,而後就使用了這個變量,會出現什麼狀況呢?用printf()函數驗證一下這種狀況。來看看這樣一段代碼:
#include<stdio.h>
int main()
{
int radius;
printf("%d",radius);
return 0;
}
和前面的那段代碼很類似,就是少了給已經定義的變量radius賦值,直接就用printf()函數輸出了。輸出結果如圖3.4所示。程序沒有輸出,而是直接運行錯誤,這是一個很嚴重的問題。因此,在使用變量的時候,必定要給變量進行賦值,否則,小則致使一些意想不到的錯誤,大則致使程序崩潰,就像上面的例子那樣。
圖3.4 未賦值的變量
p41
評:(1)是教人以愚蠢。是「以其蠢蠢令人昭昭」;"餘數R爲7""餘數R爲7""餘數R爲7""餘數R爲7",都特麼除以2的一次方了,還餘數R爲7。這做者和編輯的腦殼有多麻木啊。更雷人的是第二頁緊接着寫道:「對於n=0:Y除以20,商Z爲1,餘數R爲7」。居然有人說什麼「書寫的咋樣我不知道」「能指導新手入門,能給人幫助」。一個更比一個翔。
p48
要想真正瞭解C語言中的浮點型數值的賦值,就得從最本質上來了解計算機中的浮點型數值究竟是什麼樣的?
p61
例如,聲明一個整型變量radius,要求計算半徑爲2,1的圓的面積。那麼,就得把浮點型變量2.1賦值給整型變量radius,…
評:笑得我差點沒尿崩。
p64
算術運算主要是對經常使用的八進制數、十進制數和十六進制數進行操做。這些運算在上學的時候,常常用到。位運算主要是對不常見的二進制數的操做,這些操做對於實現二進制數的運算是很方便的。
評:這是逆天的節奏麼?聊齋也不敢這麼寫吧?這不是在坑人是什麼?
飛鳥_Asuka 評:做者這已經不是不懂C了,根本就是不懂計算機啊
p66
C語言中,每個表達式都是有一個值的,並且這個值是按照常量來處理的。對於數學運算表達式,它的值就是數學運算的結果。例如,上面表達式num*10的值就是它的計算結果30,是一個常量。所以咱們能夠按照賦值表達式的要求把它賦值給一個整型變量result。
p68
因爲位運算直接對二進制表示進行操做,所以其效率遠遠高於對其餘進製表示的算術運算。掌握好位運算能夠大大提高程序的性能。C語言提供的位運算主要有6種:左移運算、右移運算、與操做運算、或操做運算、異或操做運算、按位取反運算。
飛鳥_Asuka 評:沒有任何證據能證實「位運算的效率遠遠高於算術運算」。並且不少操做是不可比較的,由於其運算本質根本不一樣,而且底層的計算還依賴於機器
p69
按照右移運算規則:把6的二進制表示右移一位後丟掉最低位,並在最高位補原來的最高位所得的結果,……
p166
p169
本章詳細地講述了一種特殊的數組——字符數組,C語言中稱之爲字符串。
p170
後面部分將不斷補充:
3.3 浮點型賦值 3.3.1 小數在計算機的表示 3.3.2 給浮點型賦值 3.4 字符型賦值 3.4.1 字符在計算機中的表示——ascii 3.4.2 給字符賦值 3.5 類型轉化 3.5.1 什麼是類型轉換 3.5.2 類型轉換的利弊 3.5.3 隱式類型轉化和顯示類型轉換 3.5.4 賦值中的類型轉換 3.6 基本數學運算 3.6.1 數學運算和數學表達式 3.6.2 商與餘數 3.6.3 位運算 3.6.4 優先級的奧祕 3.6.5 數學運算中的類型轉換 3.7 複合賦值運算 3.7.1 複合賦值運算 3.7.2 自增自減運算——特殊的複合賦值 3.7.3 自增自減的使用 3.8 小結 3.9 習題 第4章 程序結構 4.1 語句和語句塊 4.1.1 簡單語句 4.1.2 語句塊 4.2 變量的做用域 4.2.1 局部變量的聲明定義位置規則 4.2.2 局部變量的做用域規則 4.2.3 嵌套語句塊的同名變量做用域規則 4.3 最多見的語句執行順序——順序結構 4.4 判斷結構 4.4.1 判斷的基礎——邏輯真假 4.4.2 基礎的判斷——關係運算 4.4.3 複雜的判斷——邏輯運算 4.5 if判斷結構 4.5.1 基本if結構 4.5.2 if…else…結構 4.5.3 另類的條件判斷——?運算符的使用 4.5.4 if…else if…else結構 4.5.5 嵌套的if結構 4.6 switch判斷結構 4.6.1 switch基本結構 4.6.2 果斷結束——break的使用 4.7 循環結構 4.7.1 while循環結構 4.7.2 for循環結構 4.7.3 goto語句 4.7.4 循環嵌套 4.7.5 break和continue 4.8 真正的程序——三種結構的揉和 4.9 小結 4.10 習題 第3篇 複雜數據的表示 第5章 數組 5.1 數組簡介 5.1.1 數組的用途 5.1.2 數組變量的定義 5.2 數組變量初始化和賦值 5.2.1 數組的初始化 5.2.2 數組的下標 5.2.3 給數組賦值 5.2.4 數組元素的引用 5.3 二維數組 5.3.1 數組的維 5.3.2 二維數組表示和含義 5.3.3 二維數組的初始化 5.3.4 二維數組的賦值 5.3.5 二維數組的引用 5.4 多維數組 5.4 小結 5.5 習題 第6章 字符的數組——字符串 6.1 字符數組 6.1.1 字符數組的表示 6.1.2 字符數組的初始化 6.1.3 字符數組的賦值和引用 6.2 字符串 6.2.1 字符串的c語言表示 6.2.2 使用字符串爲字符數組初始化 6.2.3 字符串的保存形式 6.3 字符串的輸入輸出——scanf和printf字符串 6.3.1 輸入輸出字符串的c語言表示 6.3.2 scanf()函數對字符串的特殊處理 6.4 小結 6.5 習題 第7章 指針 7.1 地址的概念 7.1.1 地址的含義 7.1.2 爲何要用地址 7.1.3 地址的表示與取址運算 7.2 指針和指針變量 7.2.1 指針的含義和用途 7.2.2 指針類型 7.2.3 指針變量的定義和使用 7.2.4 void指針 7.3 指針運算 7.3.1 取指針元素 7.3.2 指針的自加自減 7.3.3 指針的類型轉換 7.4 數組和指針 7.4.1 數組名也是指針 7.4.2 數組名是指針常量 7.4.3 使用數組名訪問數組元素 7.4.4 三種訪問數組元素的方法 7.4.5 數組指針和指針數組 7.5 多重指針和多維數組 7.5.1 多重指針 7.5.2 取多重指針元素運算 7.5.3 多維數組名和各維元素 7.5.4 使用指針訪問多維數組 7.6 字符串和指針 7.6.1 字符指針 7.6.2 字符指針和字符串 7.6.3 scanf()、printf()函數和字符指針 7.7 小結 7.8 習題 第8章 結構體 8.1 結構體的含義 8.2 結構體類型的表示 8.2.1 結構體類型的通常格式 8.2.2 結構體的成員變量 8.2.3 複雜的結構體 8.3 結構體變量 8.3.1 結構體變量的聲明定義 8.3.2 結構體變量初始化 8.3.3 取結構體成員運算 8.4 結構體數組 8.5 結構體指針 8.5.1 一重結構體指針 8.5.2 使用結構體指針取結構體數據 8.5.3 結構體指針例子 8.6 回到問題 8.7 小結 8.8 習題 第9章 共同體類型 9.1 共同體的含義與表示 9.1.1 共同體的用途 9.1.2 共同體的表示 9.1.3 複雜的共同體 9.2 共同體變量 9.2.1 共同體變量 9.2.2 共同體成員變量的相互覆蓋 9.2.3 使用共同體變量 9.3 共同體數組 9.4 共同體的指針 9.4.1 一重共同體指針類型 9.4.2 共同體指針變量 9.4.3 完整的例子 9.5 小結 9.6 習題 第10章 枚舉類型 10.1 枚舉類型的含義與表示 10.1.1 枚舉類型的含義 10.1.2 枚舉類型的表示 10.2 枚舉常量和枚舉變量 10.2.1 枚舉常量 10.2.2 枚舉變量的定義 10.2.3 枚舉變量的使用 10.3 枚舉數組和指針 10.3.1 枚舉數組 10.3.2 枚舉指針 10.3.3 用枚舉指針來訪問枚舉數組 10.4 typedef類型定義符 10.5 小結 10.6 習題 第4篇 複雜功能的實現 第11章 函數 11.1 函數的意義 11.2 函數的形式 11.2.1 函數的通常形式 11.2.2 函數的參數列表 11.2.3 函數的返回值類型 11.3 函數聲明和定義 11.3.1 函數的聲明 11.3.2 函數的定義形式 11.3.3 函數的形參 11.3.4 return返回值語句 11.4 本身動手寫一個函數——加法函數 11.4.1 肯定加法函數的樣子 11.4.2 實現加法函數體 11.4.3 完整的加法函數定義 11.5 函數調用 11.5.1 函數的調用做用 11.5.2 函數調用表達式 11.5.3 函數的實參 11.5.4 簡單函數的調用 11.6 複雜參數 11.6.1 數組參數 11.6.2 指針參數 11.6.3 結構體、共同體和枚舉參數 11.7 小結 11.8 習題 第12章 特殊的函數——main()函數 12.1 main()函數的做用 12.2 main()函數的聲明定義 12.2.1 main()函數的聲明形式 12.2.2 main()函數的參數 12.2.3 main()函數的返回值 12.3 小結 12.4 習題 第13章 局部變量和全局變量 13.1 變量的做用域和生命週期 13.2 函數內的局部變量 13.2.1 局部變量的做用域 13.2.2 局部變量的生命週期 13.2.3 局部變量的覆蓋做用 13.3 函數外的全局變量 13.3.1 全局變量的做用域 13.3.2 全局變量的生命週期 13.3.3 局部變量對全局變量的覆蓋做用 13.4 變量修飾符 13.4.1 使用修飾符改變變量的做用域和生命週期 13.4.2 c語言中經常使用變量修飾符的做用 13.5 小結 13.6 習題 第5篇 c語言的高級內容 第14章 預處理命令、文件包含 14.1 預處理命令的做用 14.1.1 程序預處理 14.1.2 預處理命令 14.1.3 c語言的幾類預處理命令 14.2 c語言中的宏定義 14.2.1 c語言的宏定義形式 14.2.2 不帶參宏定義 14.2.3 帶參數的宏定義 14.3 預編譯控制 14.3.1 c語言預編譯控制 14.3.2 三種預編譯控制組合形式 14.3.3 一個簡單的例子 14.4 文件包含 14.4.1 頭文件和源文件的文件名 14.4.2 頭文件和源文件的內容 14.5 include包含頭文件 14.5.1 自定義頭文件和系統頭文件 14.5.2 文件包含的兩種形式 14.5.3 完整的circle例子 14.5.4 c語言中的標準頭文件 14.6 小結 14.7 習題 第15章 文件操做 15.1 文件 15.1.1 從新認識文件 15.1.2 計算機眼裏的文件 15.1.3 開發人員能對文件幹些什麼 15.2 文件的打開關閉 15.2.1 文件指針 15.2.2 文件打開函數 15.2.3 文件關閉函數 15.3 文件讀寫 15.3.1 讀寫一個字符 15.3.2 讀寫一個字符串 15.3.3 讀寫一個數據塊 15.4 文件的其餘操做 15.4.1 隨機讀寫文件 15.4.2 出錯檢驗 15.5 小結 15.6 習題
(未完待續)